TemplateColumn中的django-tables2权限

时间:2019-01-12 12:09:31

标签: django python-3.x django-templates django-tables2

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

是什么在您的上下文中添加了permsTemplateColumns与调用模板{{ 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 %}
"""

答案 1 :(得分:0)

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

为解决此问题,我做了一些更改,将表呈现自定义代码移动到另一个模板文件。之后,我像这样render_table使用了{% render_table table 'includes/table.html' %}标签

此后,我在上面的专栏中提到的代码就可以正常工作,可以按预期实现权限。