环境:Python 2.7.3 || Django 1.4.1
我正在尝试根据登录用户的角色限制网页菜单选项。我在模型中创建了一个UserProfile类,并将其链接到文档中描述的User(在添加用户时在Django Admin中完美地工作)。例如,普通用户只有“home”和“mytasks”,而管理员用户也会有“域任务”。
以下是base.html模板中的代码:
{% if user.get_profile.role == "Admin" %}
<ul id="nav">
<li><a href="{% url home %}">Home</a></li>
<li><a href="{% url mytasks %}">My Tasks</a></li>
<li><a href="{% url domaintasks %}">Domain Tasks</a></li>
</ul>
渲染整个网站的导航栏时会检查上方。
我认为问题在于将字符串与数据库对象(下面打印)进行比较,但无法找到如何使比较工作。
>>> b = Role.objects.all()
>>> print b
[<Role: Admin>, <Role: User>]
答案 0 :(得分:0)
解决问题的正确方法是使用您为每种类型的用户创建组,django admin可以在用户注册时分配这些组,您甚至可以为现有用户编写脚本,然后使用in_group模板过滤器检查用户是否具有所需的权限。
但是你的方法是,在userprofile类中返回字符串的属性或函数是什么?如果它是那么我认为你的代码应该工作。 但是如果role是另一个模型的foriegn关键对象,那么你应该使用类似的东西进行比较: -
user.get_profile.role.attribute_in_the_other_model
答案 1 :(得分:0)
有两种方法可以做到。
Role
的相应属性,而不是您正在执行的对象。因此,如果name
中有Role
属性,则可以检查为 {% if user.get_profile.role.name == "Admin" %}
Role
模型的代码,另一种方法是在Role
模型中实现一种方法,以检查角色是否为管理员并在模板中使用它。 {% if user.get_profile.role.is_admin %}
答案 2 :(得分:0)
另一种方法是调用Role模型的字符串表示方法
{% if user.get_profile.role.__str__ == "Admin" %}
或
{% if user.get_profile.role.__unicode__ == "Admin" %}