将字符串与数据库对象django进行比较

时间:2012-10-18 07:11:45

标签: database django templates object comparison

环境: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>]

3 个答案:

答案 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" %}