Я не уверен, что вы на самом деле спрашиваете, но я попробую.
Если вы хотите проверить в шаблоне, имеет ли пользователь какое-либо из четырех разрешений, вы можете изменить
context["permissions"] = Permission.objects.filter(content_type=ContentType.objects.get_for_model(Account))
до
context["permissions"] = Permission.objects.filter(content_type=ContentType.objects.get_for_model(Account), user_set=self.request.user)
Поскольку Permission
имеет отношение ManyToMany к User
, user_set
для экземпляра Permission
будет содержать все Users
имея это разрешение.В результате context["permissions"]
содержит только те права доступа Account
, которые есть у User
.Это означает, что в вашей таблице не отображаются разрешения, которых нет у пользователей, поэтому это может быть не то, что вам нужно.
Если у вас возникли проблемы с частью
{% if account.user.has_perm %}
,есть 2 решения, которые приходят мне на ум;Статическое решение и динамическое решение.
Статический:
Так как в этом случае есть только 4 разрешения, вы также можете попробовать, что Тим Каманин делает в https://timonweb.com/posts/how-to-get-a-list-of-all-user-permissions-available-in-django-based-project/. Это будет означать, что вы удалите цикл и для каждого изВ 4 разрешения вы можете добавить блок, похожий на
{% if perm.account.has_user_hijack_permission %}
<td>
<span class="icon is-small">
<i class="fas fa-check-circle has-text-success"></i>
</span>
</td>
{% else %}
<td>
<span class="icon is-small">
<i class="fas fa-times-circle has-text-danger"></i>
</span>
</td>
{% endif %}
Динамический:
На Проверить разрешение внутри шаблона в Django написано, что {{ perms }}
содержит все разрешения пользователяимеет, поэтому динамическое решение будет
{% for permission in permissions %}
{% if permission in perms %}
<td>
<span class="icon is-small">
<i class="fas fa-check-circle has-text-success"></i>
</span>
</td>
{% else %}
<td>
<span class="icon is-small">
<i class="fas fa-times-circle has-text-danger"></i>
</span>
</td>
{% endif %}
{% endfor %}
Динамическое решение обладает большей гибкостью и является более RESTFUL, так как если вы расширяете запрос в context["permissions"]
или добавляете дополнительные разрешения для класса Account
, это все ещеработает.
--- редактирует учетные записи для комментариев ---
В случае, если вам нужны разрешения для User
, к которому вы обращаетесь вместо User
, который вывыполнив вход, вы можете, согласно Как получить разрешения пользователя? , заменить {{ perms }}
на {{ accessed_user_permissions }}
после добавления
context["accessed_user_permissions "] = user.user_permissions.all()
Обратите внимание, что это не включает разрешения группы,Если вы хотите включить разрешение groep, вам нужно сделать что-то вроде
context["accessed_user_permissions "] = user.user_permissions.all() | user.group_permissions.all()