Разрешения django-tables2 в TemplateColumn - PullRequest
0 голосов
/ 12 января 2019

Мне кажется, что я прочитал об этом сто раз, но все еще не могу понять, как использовать разрешения в django-tables2 TemplateColumn.

Моя цель - иметь возможность отображать кнопки в столбце на основе разрешений, которые пользователь может иметь или не иметь в данной модели. Это не кажется сложным для меня, и из того, что я прочитал, я смогу использовать что-то вроде {% if perms.myapp.delete_mymodel %} для достижения того, что я хотел бы сделать.

Вот код, который я пытаюсь заставить работать, как я ожидаю:

import django_tables2 as tables


MY_MODEL_ACTIONS = """
{% if perms.myapp.change_mymodel %}
<a href="{% url 'myapp:my_model_edit' pk=record.pk %}" class="btn btn-sm btn-warning"><i class="fas fa-edit"></i></a>
{% endif %}
{% if perms.myapp.delete_mymodel %}
<a href="{% url 'myapp:my_model_delete' pk=record.pk %}" class="btn btn-sm btn-danger"><i class="fas fa-trash"></i></a>
{% endif %}
"""


class MyModelTable(tables.Table):
    # some columns
    actions = tables.TemplateColumn(
        verbose_name="",
        template_code=MY_MODEL_ACTIONS,
    )

    class Meta(BaseTable.Meta):
        model = MyModel
        fields = (
            # some columns
            "actions",
        )

При рендеринге таблицы не возникает никаких проблем, но в столбце просто не отображаются кнопки (да, у меня есть разрешения на их отображение). Удаление пунктов {% if … %}, тем самым удаляя проверки разрешений, позволяет разумеется видеть кнопки.

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Проблема была немного хитрой. Я определил свой собственный шаблон для отображения таблицы и не использовал внутри нее тег {% render_table table %}. Из-за этого контекст не был доступен из кода TemplateColumn.

Чтобы это исправить, я немного изменил шаблон и переместил свою таблицу, отображающую пользовательский код, в другой файл шаблона. После этого я использовал тег render_table, как этот {% render_table table 'includes/table.html' %}

После этого код, который я упомянул выше в столбце, работает нормально, разрешения выполняются, как и ожидалось.

0 голосов
/ 14 января 2019

Что добавляет perms в ваш контекст? TemplateColumns не имеет того же контекста, что и шаблон, из которого вызывается {{ render_table table }}, поэтому вы должны быть немного более явным.

В документации для render_table упоминается, что он присоединит контекст вызывающего шаблона к table.context, поэтому это должно решить вашу проблему:

MY_MODEL_ACTIONS = """
{% if table.context.perms.myapp.change_mymodel %}
<a href="{% url 'myapp:my_model_edit' pk=record.pk %}" class="btn btn-sm btn-warning"><i class="fas fa-edit"></i></a>
{% endif %}
{% if table.context.perms.myapp.delete_mymodel %}
<a href="{% url 'myapp:my_model_delete' pk=record.pk %}" class="btn btn-sm btn-danger"><i class="fas fa-trash"></i></a>
{% endif %}
"""
...