【问题标题】:User permissions for Django moduleDjango 模块的用户权限
【发布时间】:2011-06-20 19:06:59
【问题描述】:

我的 Django 模板中的权限存在一个小问题。

我正在尝试根据权限在我的项目的菜单栏中显示一个图标。我想拥有它,这样如果用户有权向项目添加新的跟进,他们可以看到图标,如果他们没有该权限,则不要显示链接。

我的权限语法是follow.add_followup,这是我通过打印user.get_all_permissions()得到的。

我已经在我的模板中尝试过这段代码:

...
{% if user.has_perm('followup.add_followup') %}
<li><a href="{% url followup-new p.id %}">Log</a></li>
{% endif %}
...

但是当我显示模板时,我会遇到这个错误:

/project/232/view/ 处的模板语法错误

无法解析余数:'(followup.add_followup)' from 'user.has_perm(followup.add_followup)'

有什么想法吗?这让我很头疼! :)

【问题讨论】:

    标签: python django django-templates django-views django-permissions


    【解决方案1】:

    我已经在我的模板中尝试过这段代码:

    这种复杂的决策在视图函数中。

    或者它进入上下文,然后呈现给模板。

    https://stackoverflow.com/search?q=%5Bdjango%5D+context

    When to use context processor

    在你看来这样做

    def my_view( request ):
        followup= user.has_perm('followup.add_followup')
        # etc.
        return render_to_response( template, {'followup':followup,... )
    

    那么你的模板很简单

    {% if followup %}
    <li><a href="{% url followup-new p.id %}">Log</a></li>
    {% endif %}
    

    【讨论】:

    • 我在模板中尝试它的原因是因为我不想显示登录用户无法使用的图标。
    • 可以在视图函数中创建一个布尔值,在模板中使用一个简单的{%if%}来显示或不显示。
    • 不是真的或有帮助,请参阅下面的答案。
    【解决方案2】:

    由于你使用的是django权限系统,最好使用以下g模板语法...

    {%if perms.followup.add_followup%}your URL here{%endif%}
    

    编辑:Django 自动为每个模型创建 3 个权限,“添加”、“更改”和“删除”。如果不存在添加链接的模型,则必须在模型类Meta中添加相关模型的权限... 同样:

    somemodels.py

    class SomeModel(Model):
        ...
        class Meta:
        permissions = (('add_followup','Can see add urls'),(...))
    

    在 Django auth 用户管理页面,你可以看到你的权限。在模板层,权限以基本的Django风格呈现,

    <app_label>.<codename>
    

    在这种情况下,会是这样的:

    {%if perms.somemodels.add_followup%}your URL here{%endif%}
    

    如果没有模型,与您希望做的工作相关,将权限添加到模型...

    在你的模板中,你可以写

    {{perms.somemodels}}
    

    为该用户密封可用权限,其中somemodel 是您将权限添加到其模型之一的应用程序的名称。

    【讨论】:

      【解决方案3】:

      Django 文档详细说明了答案 #2: https://docs.djangoproject.com/en/dev/topics/auth/#id9

      当前登录用户的权限存储在模板变量 {{ perms }} 中。这是 django.contrib.auth.context_processors.PermWrapper 的一个实例,它是一个模板友好的权限代理。

      【讨论】:

      【解决方案4】:

      这是我非常简单的解决方案,在您的模板中添加:

      例如:

      .......
      
      {% if 'user.can_drink' in user.get_all_permissions %}
         {{ user }} can drink.
         .......
      {% else %}
         {{ user }} can´t drink.
          ........
      {% endif %}
      
      .......
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-10
        • 1970-01-01
        • 1970-01-01
        • 2014-02-22
        • 2021-02-22
        • 1970-01-01
        • 2014-05-23
        相关资源
        最近更新 更多