2

Использование Đăng-tables2 пользовательскую таблицу:Как использовать права доступа пользователей в Джанго-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 

мне нужно проверьте разрешение FOO на view_column. Потому что, view_column - это атрибут класса, я не могу использовать декоратор как @permission_required.

Возможно, я мог бы вызвать что-то другое, кроме tables.LinkColumn, чтобы проверить разрешение и затем вернуть столбец. Однако для этого мне нужно будет получить доступ к объекту пользователя (возможно, из объекта запроса), к которому у меня сейчас не будет доступа.

Есть ли более простой способ для этого?

В принципе идея состоит в том, чтобы показать столбец только в том случае, если есть доступ к нему или вообще не отображается.

ответ

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) 

Теперь, если пользователь имеет правильное разрешение, то он будет отображать ссылку - если нет, то будет отображаться только идентификатор каждой записи.

+0

У этого 2 недостатка, как я вижу. Столбец не является обязательным. Я знаю, что его не спрашивали, но это то, что вы получаете, если разрешения были проверены перед возвратом объекта Column. Это также кажется большим штрафом за производительность. – rsd

+0

Я начинаю думать, что это может быть единственным решением. Django кэширует код выполнения, поэтому я не знаю, можно ли доверять тому, что следующий запрос будет для одного и того же пользователя. django-tables2 использует метод __new__ для сбора информации о столбцах, которая также дает меньше места для манипуляции с атрибутами класса. – rsd

+0

Как я уже сказал, я использую это решение в подобных случаях. Нет никакого штрафа за производительность, если вы используете разбивку на страницы в таблицу (т. Е. Отображаете менее 100 строк для каждой страницы). Существуют и другие решения, но тогда вам, вероятно, придется манипулировать таблицей в представлении (или определить две таблицы, одна с view_column и одна без нее, и сделать правильный вариант в зависимости от разрешений - не DRY). – Serafeim

0

Попробуйте функцию 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') 
Смежные вопросы