条件列显示,django-tables2

Conditional column display, django-tables2

我开发了一个table,使用django-tables2显示模型的记录。此 table 的最后一列是一个“编辑按钮”,它将用户引导至其行记录的“编辑页面”。

我想要的是用户只有拥有编辑模型的权限才能看到edit column

另外我需要提到的是,目前我正在使用 SingleTableView 来开发 table 视图。

1:要使整个列隐藏,您可以“排除”该字段来自 table查看。

class MyTableView(SingleTableView):
    # class based view
    model = MyModel
    table_class = MyTable

    def get_table(self, **kwargs):
        table = super(MyTableView, self).get_table(**kwargs)
        if not self.request.user.has_perm("can_edit"):
            table.exclude = ('edit_button',) 
        return table

def my_table_view(request):
    # function based view

    table = MyTable(<queryset>)

    if not request.user.has_perm("can_edit"):
        table.exclude = ('edit_button',) 

    [...]
    return render(request, template, context)

2:要隐藏列中的按钮,您可以在使用自定义渲染函数渲染编辑按钮之前检查权限。

https://django-tables2.readthedocs.io/en/latest/pages/custom-data.html#table-render-foo-methods

class MyTable(tables.Table):

    edit_button = tables.Column()

    def render_edit_button(self, record):

        if request.user.has_perm("can_edit"):
            url = reverse("edit_view", args=(record.id,))

            return mark_safe(f'<a href="{url}">Edit {record.id}</a>')
        return mark_safe("")

正如我提到的,我正在使用 SingleTableView。所以我发现 SingleTableView class 中有一个方法,根据它的文档:

Allows passing customized arguments to the table constructor.

所以为了删除 edit 列,我在我的视图 class 中添加了这个方法(它继承自 SingleTableView:

    def get_table_kwargs(self):
            if not self.request.user.has_perm('permission_to_edit'):
                return {'exclude': ('edit_column',)}
            else:
                return {}