0

环境:Python 2.7.3 || Django 1.4.1

我正在尝试根据登录用户的角色来限制网页菜单选项。我在模型中创建了一个 UserProfile 类,并将其链接到用户,如文档中所述(在添加用户时,在 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>]
4

3 回答 3

0

解决问题的正确方法是为每种类型的用户创建组,您可以使用 django admin 在用户注册时分配这些组,您甚至可以为现有用户编写脚本,然后使用 in_group 模板过滤器检查是否用户具有所需的权限。

但是按照您的方法,角色是返回字符串的 userprofile 类中的属性还是函数?如果是,那么我认为您的代码应该可以工作。但如果角色是另一个模型的外键对象,那么你应该使用类似的东西进行比较:-

user.get_profile.role.attribute_in_the_other_model
于 2012-10-18T07:47:11.730 回答
0

有两种方法可以做到这一点。

  • Role像你做的那样检查 , 而不是对象的适当属性。因此,如果您具有namein 属性Role,则可以检查为

{% if user.get_profile.role.name == "Admin" %}

  • 如果您可以修改模型代码的另一种Role方法是在模型中实现一个方法Role来检查角色是否为管理员并在模板中使用它。

{% if user.get_profile.role.is_admin %}

于 2012-10-18T08:08:12.820 回答
0

另一种方法是调用 Role 模型的字符串表示方法

{% if user.get_profile.role.__str__ == "Admin" %}

或者

{% if user.get_profile.role.__unicode__ == "Admin" %}
于 2012-10-18T08:36:42.527 回答