【问题标题】:How to use user permissions in django-tables2 Column如何在 django-tables2 专栏中使用用户权限
【发布时间】:2016-08-07 14:30:23
【问题描述】:

使用 djang-tables2 自定义表格作为:

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 是一个类属性,所以我不能使用装饰器作为@permission_required。

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

有更简单的方法吗?

基本上,这个想法是仅在有访问权限或根本不显示时才显示列。

【问题讨论】:

    标签: python django permissions django-class-based-views django-tables2


    【解决方案1】:

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

    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)
    

    现在,如果用户拥有正确的权限,那么它将显示链接 - 如果没有,它将仅显示每条记录的 id。

    【讨论】:

    • 我可以看到这有两个缺点。该列不是可选的。我知道它没有被要求,但如果在返回 Column 对象之前检查了权限,这就是你得到的。这似乎也是一个很大的性能损失。
    • 我开始认为这可能是唯一的解决方案。 Django缓存了执行代码,所以我不知道是否可以相信下一个请求将针对同一用户。 django-tables2 使用 new 方法来收集有关列的信息,这也为类属性操作提供了更少的空间。
    • 正如我所说,我在类似情况下使用此解决方案。如果您对表使用分页(即每页呈现少于 100 行),则不会降低性能。还有其他解决方案,但您可能需要在视图中操作表(或定义两个表,一个带有 view_column,一个不带它,并根据权限呈现正确的一个 - 而不是 DRY)。
    【解决方案2】:

    试试 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')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      • 2020-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多