TemplateColumn 中的 django-tables2 权限

django-tables2 permissions in TemplateColumn

我觉得我已经读了一百遍了,但我仍然不知道如何在 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",
        )

呈现 table 时未触发任何问题,但该列只是不显示任何按钮(是的,我确实有权显示它们)。删除 {% if … %} 子句,从而删除权限检查,当然可以看到按钮。

什么将 perms 添加到您的上下文?TemplateColumns 与调用模板 {{ render_table table }} 的上下文不同,因此您必须更明确一点。

The documentation for render_table mentions it will attach the context of the calling template to 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 %}
"""

这个问题有点棘手。我定义了自己的模板来呈现 table 并且没有在其中使用 {% render_table table %} 标签。因此,无法从 TemplateColumn 代码访问上下文。

为了解决这个问题,我稍微更改了模板并将 table 渲染自定义代码移至另一个模板文件。之后我像这样使用 render_table 标签 {% render_table table 'includes/table.html' %}

在此之后,我在专栏中上面提到的代码工作正常,权限如预期的那样得到尊重。