Django:如果用户不是超级用户,则在模板中隐藏按钮

54

如何让你的模板/视图识别已登录用户是否为超级用户?

我的表单中有一些按钮(在模板中),如果用户不是超级用户,我希望这些按钮完全隐藏。

你会怎么做呢?

3个回答

121

查看User对象上的is_superuser

{% if request.user.is_superuser %}
    ...
    <button>...</button>
    ...
{% else %}
...
{% endif %}

编辑:在@mustafa-0x的评论后

以上假设您已将django.core.context_processors.request包含在您的TEMPLATE_CONTEXT_PROCESSORS设置中,这不是默认设置

TEMPLATE_CONTEXT_PROCESSORS的默认设置

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.contrib.auth.context_processors.auth',
    'django.core.context_processors.debug',
    'django.core.context_processors.i18n',
    'django.core.context_processors.media',
    'django.core.context_processors.static',
    'django.core.context_processors.tz',
#    'django.core.context_processors.request',
    'django.contrib.messages.context_processors.messages',
)

已经包含了django.contrib.auth.context_processors.auth(特别需要注意的是,没有包括request上下文处理器),这意味着在大多数情况下,您已经可以访问{{user}}而无需通过视图添加它到上下文中或启用request上下文处理器。如果您需要通过{{request.user}}访问用户,则需要启用request上下文处理器。


@TimmyO'Mahony,代码无法运行,链接也失效了... 你能解释一下为什么拒绝了这次编辑吗? - mustafa.0x
你改变了意思。在模板中,user对象通常可以通过request访问 - 你删除了request,这意味着user对象需要添加到视图的上下文中,这是浪费的,因为大多数人都会在请求中拥有它。至于链接,你是对的,它不起作用。我已经更新了它。 - Timmy O'Mahony
是的?你想要什么?我的示例完全有效,而且我已经解释过了。文档决定不使用在模板中通过上下文处理器本来可用的 request 对象,而是假定您在呈现模板之前添加了 user 对象。我不喜欢做那样的假设,我喜欢使用 request 对象。没有对错之分,请不要试图挑起争论。 - Timmy O'Mahony
好的,我再搜索了一下。看起来user在默认上下文,但是request不在。另请参阅:https://dev59.com/vmLVa4cB1Zd3GeqPy7Rj#10158892 - mustafa.0x
好的,对不起,我现在明白你的意思了,你是正确的。它不是默认上下文中存在,而是默认情况下,在TEMPLATE_CONTEXT_PROCESSOR设置文件中包括上下文处理器django.contrib.auth.context_processors.auth,这意味着您确实可以访问user对象(以及permsmessages),因为它们被透明地添加了进去。我习惯于始终包含自己的TEMPLATE_CONTEXT_PROCESSOR,而不是使用默认的global_settings.py值,所以我没有意识到默认设置。对不起。 - Timmy O'Mahony
显示剩余4条评论

21

如评论中所讨论的,您可以在模板中自动使用可用的User对象:

{% if user.is_superuser %}
<div class="alert alert-success" role="alert">
You are logged in as {{user.first_name}}, here are the
<a href="/admin/">admin pages</a> for changing content.
</div>
{% endif %}
你也可以使用 user.is_staff,这可能更合适。

0
实际上,当您尝试检查登录HTML模板中的用户是否为超级用户时,您将无法这样做,因为在那个瞬间它将是错误的。您可以在views.py文件中检查用户是否为超级用户,然后将其重定向到任何您想要的地方。 您可以像start函数中看到的那样执行某些操作

请勿将代码作为图片链接。相反,请[编辑](https://stackoverflow.com/posts/57338808/edit)您的答案并将代码粘贴为格式化文本。 - Theo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接