条件列显示,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 {}
我开发了一个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 {}