我有一个名为Account的模型,该模型连接到默认的User模型。到目前为止,我正在遍历与“帐户”模型关联的所有权限,但我还想检查“帐户配置文件”页面的用户是否具有正在遍历的一个或多个特定权限。目的只是为了创建一个简单的概述。
我也尝试检查perms.cms.get_permission_codename
。
class Account(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
site = models.CharField(max_length=50, choices=(('all', 'all'), ('danielk', 'danielk'), ('flis', 'flis'), ('vmusic', 'vmusic')), blank=True)
site_role = models.CharField(max_length=50, choices=(('Administrator', 'Administrator'), ('Moderator', 'Moderator'), ('Editor', 'Editor')))
phone_number = models.CharField(max_length=8)
birth_date = models.DateField()
street_adress = models.CharField(max_length=255)
note = models.TextField(blank=True);
zip_code = models.CharField(max_length=4)
city = models.CharField(max_length=255)
def formatedPhone(self, country=None):
return phonenumbers.parse(Account.phone_number, "NO")
"""
def __str__(self):
return "%s %s" % (self.User.first_name, self.user.last_name)
"""
def get_absolute_url(self):
return reverse('account-detail', kwargs={'pk': self.pk})
class Meta:
verbose_name = 'Account meta'
verbose_name_plural = 'Accounts meta'
permissions = (
("has_user_hijack_permission", "Allows the user to log in as others"),
("has_user_management", "Allows a user to deactivate/delete other users"),
("has_user_site_edit", "Allows a user to edit site and role details"),
("has_user_takeout", "Can export user details"),
)
class cms_users_user_permissions(generic.DetailView):
model = Account
template_name = 'cms/users/cms-users-user-permissions.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["permissions"] = Permission.objects.filter(content_type=ContentType.objects.get_for_model(Account))
#context['permissions'] = Permission.objects.filter(content_type_id=7)
return context
<table class="table is-fullwidth">
<tbody>
{% for permission in permissions %}
<tr>
<td style="width: 300px;">{{ permission.codename }}</td>
<td>{{ permission.name }}</td>
{% if account.user.has_perm %}
<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 %}
</tr>
{% endfor %}
</tbody>
</table>
答案 0 :(得分:0)
我不确定您真正要问的是什么,但我会尝试一下。
如果要在模板中检查用户是否具有这四个权限中的任何一个,则可以更改
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
与User
具有ManyToMany关系,因此user_set
实例的Permission
将包含所有具有该权限的Users
。结果将是context["permissions"]
仅包含Account
拥有的User
的权限。这意味着您的表不会显示用户没有的权限,因此这可能不是您想要的。
如果您在
上遇到问题 {% if account.user.has_perm %}
部分,我想到两种解决方案;静态解决方案和动态解决方案。
静态:
由于在这种情况下只有4个权限可以检查,因此您也可以在https://timonweb.com/posts/how-to-get-a-list-of-all-user-permissions-available-in-django-based-project/上尝试Tim Kamanin的操作。这意味着您将删除循环,对于这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 %}
动态:
在Check permission inside a template in 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
的权限,则可以根据How to get user permissions?
,在添加
{{ 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()