我有一个应用程序,我使用django-guardian
获得对象级权限。在我的ListView
中,我在一个表中列出了我的所有实例。在每一行中,如果用户有权编辑此对象,我需要显示编辑按钮。
所以,我做了一些类似的事情:
{% extends "base.html" %}
{% load guardian_tags %}
{% block content %}
<table>
<thead>...</thead>
<tbody>
{% for i in items %}
<tr>
<td>{{ i.name }}</td>
<td>
{% get_obj_perms request.user for i as "i_perms" %} <!-- this one -->
{% if "change_item" in i_perms %}
<a href="{% url 'edit_item' i.id %}">Edit</a>
{% endif %}
</td>
</tr>
{% endif %}
</tbody>
</table>
{% endblock %}
问题
这样做并不是数据库方面的优化解决方案。此解决方案对每个对象进行数据库查询以获取用户权限。我如何做到这一点,但只需点击数据库即可获得所有对象的用户权限?
我认为您需要在视图中使用get_objects_for_user,并通过上下文将其传递到模板中,例如,在基于函数的视图中,或作为CBV 中get_extra_context((的一部分
from guardian.shortcuts import get_objects_for_user
items = Item.objects.all()
permitted_items = get_objects_for_user(request.user, 'change_item', klass=items)
context['permitted_items'] = permitted_items
...
然后在您的模板中
{% for i in items %}
<tr>
<td>{{ i.name }}</td>
<td>
{% if i in permitted_items %}
<a href="{% url 'edit_item' i.id %}">Edit</a>
{% endif %}
</td>
</tr>
{% endfor %}