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' %}
在此之后,我在专栏中上面提到的代码工作正常,权限如预期的那样得到尊重。
我觉得我已经读了一百遍了,但我仍然不知道如何在 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' %}
在此之后,我在专栏中上面提到的代码工作正常,权限如预期的那样得到尊重。