1

在每个页面 ( base.html) 中,我想检查request.user我的班级是否有管理员角色UserTypes并显示管理员链接。目前我做这样的事情:

{% if user.profile.user_types.all %}
    {% for user_type in user.profile.user_types.all %}
        {% if user_type.name == "ad" %}
            <li>
                <a href="{% url admin:index %}" class="round button dark ic-settings image-left">Admin</a>
            </li>
        {% endif %}
    {% endfor %}
{% endif %}

user.profile只是从 DjangoUser到我的UserProfile.

但这似乎有点冗长和笨拙。有没有更简单的方法?也许我应该编写自己的自定义上下文处理器并传递一个变量之类的is_admin东西,但我之前从未编写过自定义上下文处理器......

4

1 回答 1

6

您可以向模型添加方法is_adminUserProfile将业务逻辑移动到模型中。

请注意,像这样的构造

{% if user.profile.user_types.all %}
    {% for user_type in user.profile.user_types.all %}
    ...
    {% endfor %}
{% endif %}

点击 2 sql 查询到您的数据库。但是with模板标签将它们减少到 1 次命中。

{% with types=user.profile.user_types.all %}
{% if types %}
    {% for user_type in types %}
    ...
    {% endfor %}
{% endif %}
{% endwith %}

实际上,最好的地方是模型。但是您应该了解 django 为您的目的提供什么(contrib.auth、权限、用户组)。可能你重新发明了轮子。

那么条件{% if user_type.name == "ad" %}不应该在你的python代码中硬编码(尤其是在模板中)。

于 2012-05-07T19:04:39.040 回答