如何在django-tables2 Column中使用用户权限

How to use user permissions in django-tables2 Column

使用 djang-tables2 自定义 table 作为:

tables.py:

import django_tables2 as tables
from django_tables2.utils import A
from .models import Person

class PersonTable(tables.Table):

    view_column = tables.LinkColumn('person:pessoas_detail', args=[A('pk')])

    class Meta:
        model = Person

views.py:

from .models import Person

class ListView(SingleTableView):
    model = Person
    table_class = PersonTable

我需要检查 view_column 上的 FOO 权限。 因为,view_column 是一个 class 属性,所以我不能将装饰器用作 @permission_required.

也许我可以调用 tables.LinkColumn 以外的东西来测试权限,然后 return 列。但是,为了做到这一点,我需要访问用户对象(可能来自请求对象),此时我无法访问它。

有更简单的方法吗?

基本上,我们的想法是仅在有权限访问时才显示列,否则根本不显示。

我认为更简单的方法是使用模板列(我就是这样做的):

view_column = tables.TemplateColumn("""
  {% if has_perm('FOO') %}
    <a href='{% url "person:pessoas_detail" record.id %}>{{ record.id }}</a>
  {% else %}
    {{ record.id }}
  {% endif %}
""", orderable=False)

现在,如果用户拥有正确的权限,那么它会显示 link - 如果没有,它只会显示每条记录的 ID。

试试 before_render 函数。

    Example::
        class Table(tables.Table):
            name = tables.Column(orderable=False)
            country = tables.Column(orderable=False)
            def before_render(self, request):
                if request.user.has_perm('foo.delete_bar'):
                    self.columns.hide('country')
                else:
                    self.columns.show('country')