我想显示一个菜单,该菜单根据当前登录用户的用户组进行更改,此逻辑位于我的视图中,然后设置一个变量以检查模板以确定要显示的菜单项。 ......之前我曾问过这个问题,但我的逻辑是在模板中完成的。所以现在我想在我看来...菜单如下所示
<ul class="sidemenu">
<li><a href="/">General List </a></li>
<li><a href="/sales_list">Sales List </a></li>
<li><a href="/add_vehicle">Add a New Record </a></li>
<li><a href="/edit_vehicle">Edit Existing Record </a></li>
<li><a href="/filter">Filter Records </a></li>
<li><a href="/logout">Logout </a></li>
</ul>
支持用户是管理层,他们会看到所有内容......但假设用户在群组销售中,他们只会看到前两个和最后两个项目......依此类推。我还希望在登录后根据用户的组进行动态重定向。有什么想法吗?
答案 0 :(得分:26)
检查权限的标准Django方法是通过单独的权限标志,而不是测试组名。
如果您必须检查群组名称,并且知道“用户到群组”是多对多关系,则可以在模板的群组列表中获取第一个群组,例如:
{{ user.groups.all.0 }}
或在条件中使用它(未经测试但应该有效):
{% ifequal user.groups.all.0 'Sales' %}
...
{% endif %}
如果您使用首选权限模型,则可以执行以下操作:
...
{% if perms.vehicle.can_add_vehicle %}
<li><a href="/add_vehicle">Add a New Record </a></li>
{% endif %}
{% if perms.vehicle.can_change_vehicle %}
<li><a href="/edit_vehicle">Edit Existing Record </a></li>
{% endif %}
...
这些是syncdb
为您自动创建的权限,假设您的应用被称为vehicle
且模型名为Vehicle
。
如果用户是超级用户,则他们会自动拥有所有权限。
如果用户在销售组中,他们将不具有这些车辆权限(除非您已将这些权限添加到该组中)。
如果用户在管理组中,他们可以拥有这些权限,但您需要将它们添加到Django管理站点中的组。
对于您的其他问题,请根据用户组重定向登录:用户到群组是多对多关系,因此将其用作一对多不是一个好主意。
答案 1 :(得分:10)
在app / templatetags中创建一个user_tags.py,如上所示:
myChar
最后在模板中使用它:
# -*- coding:utf-8 -*-
from __future__ import unicode_literals
# Stdlib imports
# Core Django imports
from django import template
# Third-party app imports
# Realative imports of the 'app-name' package
register = template.Library()
@register.filter('has_group')
def has_group(user, group_name):
"""
Verifica se este usuário pertence a um grupo
"""
groups = user.groups.all().values_list('name', flat=True)
return True if group_name in groups else False
答案 2 :(得分:5)
user.groups.all.0.name == "groupname"
答案 3 :(得分:1)
如果您正在使用自定义用户模型(Django 的最佳实践),您可以创建一个方法:
CustomUser(AbstractUser):
# Your user stuff
def is_manager(self):
return self.groups.filter(name='Management').exists()
然后在你的模板中你就这样称呼它:
{% if user.is_manager %}
{# Do your thing #}
{% endif %}
该方法对于验证代码其他部分(视图等)的权限也很有用