我想显示的是,根据用户组的用户当前登录的变化,与此逻辑我的视图的内部作为一个菜单,然后设置一个变量在模板中进行检查以确定要显示哪些菜单项....我以前问过这个问题,但我的逻辑是在模板正在做。 所以,现在我想在我看来...菜单看起来如下
<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>
Suppossing用户管理,他们将看到的一切......不过,假设用户在该组销售,让他们只能看到前两个和最后两个项目......等等。 我也希望根据用户组登录后动态重定向。 有任何想法吗?
检查权限的标准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管理站点。
对于你的另一个问题,重定向登录基于用户组:用户到组是一个多一对多的关系,所以它不是一个真正的好主意,使用它像一个一对多。
在您的应用程序创建一个user_tags.py / templatetags上面如下:
# -*- 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
最后在模板中使用它:
{% if request.user|has_group:"Administradores"%}
<div> Admins can see everything </div>
{% endif %}
user.groups.all.0.name == "groupname"