【问题标题】:Check user permission in template (not request user)检查模板中的用户权限(不请求用户)
【发布时间】:2017-12-11 15:28:01
【问题描述】:

您好,有什么方法可以检查模板中自定义用户 nit 请求用户的权限。 代码示例:

{% for agency_user in users %}
    <tr>
        <td>{{ agency_user.username }}</td>
        <td>{{ agency_user.get_full_name }}</td>
        <td>{{ agency_user.groups.all.first.name }}</td>
        <td>{{ agency_user.min_price }}</td>
        <td>{{ agency_user.max_price }}</td>
        {% if agency_user|has_perm:'may_see_commerce_sell' %} #not working
            <td>some action</td>
        {% else %}
            <td>some action</td>
        {% endif %}
        <td>
            <a href="{% url 'user_edit' agency_user.id  %}" class="edit icon"></a>
            <a user-id="{{ agency_user.id }}" class="trash icon" title="some action"></a>
        </td>
    </tr>
    {% empty %}
        <td style="text-align: center" colspan="11">some action</td>
{% endfor %}

或者我必须为每个用户权限编写自定义模型方法?

类似于在 Profile 模型中思考的东西:

def sell_commerce(self):
    if self.has_perm('may_see_commerce_sell'):
        return True
    else:
        return False

【问题讨论】:

    标签: django django-templates django-permissions


    【解决方案1】:

    在您的应用程序目录中创建一个目录,将其命名为templatetags,然后在templatetags 中创建mytage.py 文件,然后执行类似的操作

    #mytage.py
    from django import template
    register = template.Library()
    
    @register.filter()
    def check_permission(user, permission):
        if user.user_permissions.filter(codename = permission).exists():
            return True
        return False
    

    然后在模板中加载你的标签

    {%load mytags%}
    <html lang="en">
    .................
    {% if user|check_permission:'delete_bills' %}
            ... do something if have permission ...
    {% endif %}
    ...........
    </html>
    

    您可以按名称或代号字段过滤权限

    列出当前用户的所有权限

    登录后在您的 django 视图中的任何位置

    for perm in request.user.permissions.all():
        print(perm.name)
        print(perm.codename)
        print(perm)
    

    这将在控制台中打印当前登录用户的所有权限

    【讨论】:

    • 别忘了它必须在 INSTALLED_APPS 列表中。
    【解决方案2】:

    您可以自己创建一个模板过滤器来检查这一点,例如..

    from django.template import Library
    
    register = Library()
    
    @register.filter()
    def check_permission(user, permission):
        return user.has_perm(permission)
    

    那就这样用吧..

    {% if user|check_permission:'may_see_commerce_sell' %}
        ... do stuff ...
    {% endif %}
    

    【讨论】:

    • 我创建了一个 templatetags 目录并使用下面的代码添加 check_perms.py + init 然后将其加载到模板中,但我收到错误“check_perms”不是已注册的标签库。必须是以下之一:
    • templatetags 目录必须在您已安装的应用程序之一中。
    • 在accounts(app)/templatetags/文件夹下
    猜你喜欢
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 2017-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多