5

我正在使用 django-registration,然后进行设置。

{{user.is_authenticated }}

是的,即使我已经去 /accounts/logout/ 并注销了用户。

{{user.is_anonymous }} 

也返回 true。根据 django 文档,这两个应该是不同的:

is_anonymous:总是返回 False。这是一种区分 User 和 AnonymousUser 对象的方法。通常,您应该更喜欢使用 is_authenticated() 而不是此方法。

is_authenticated:始终返回 True。这是一种判断用户是否已通过身份验证的方法。这并不意味着任何权限,也不会检查用户是否处于活动状态 - 它仅表明用户提供了有效的用户名和密码。

我正在使用 django-registration 附带的标准视图,但尚未触及它们。在模板中,我有以下代码:

{% if user.is_authenticated %}
{% user }}
{% if user.is_anonymous %}
    is anonymous
{% endif $}
{% else %}
    gotta login
{% endif %}

问题会出在哪里?我会很感激的!

更新:我注意到在主页上,is_authenticated 和 id_anonymous 都返回 True,而如果我在登录前转到 /accounts/login,则只有 is_anonymous 返回应为的 true。而且,在主页上,如果有帮助,我有以下观点:

def home(request):
    return render_jinja(request, 'index.html', blah = 'ga')

更新 2: print(request.user.is_authenticated()) 给出 False。然后,我有:

return render_jinja(request, 'index.html', blah = 'ga')

在模板中,user.is_authenticated 返回 FALSE。

更新3:如果我使用render_to_response,而不是render_jinja,一切都很好。仍然不知道如何解决这个问题:(

4

2 回答 2

11

似乎您正试图同时弄清楚两件事;什么是使用 jinja 模板的正确方法以及与 User/AnonymousUser 的处理方式是什么。也许尝试一次解决这些问题。

我对 jinja 没有经验,但您可能需要检查并确保您考虑到了 jinja 和 django 模板语法之间的差异。我知道的最大区别是方法调用需要显式括号。因此,示例中的 is_authenticated 和 is_anonymous 调用需要括号。

Jinja style {{ user.is_authenticated() }}
Django style {{ user.is_authenticated }} 

如果这不能解决问题,请尝试安装django-debug-toolbar并查看模板的上下文。检查并查看user是 None 还是对象(User 或 AnonymousUser)。

您还可以阅读AnonymousUser并查看文档中检查经过身份验证的用户的示例。简而言之,对于 AnonymousUser 对象,is_anonymous() 总是返回 True 而不是 False,is_authenticated() 总是返回 False 而不是 True。

于 2010-11-29T02:52:08.620 回答
4

砸在头上。我在某处读到:

if user.is_authenticated: ....# 总是正确的,因为它是一个方法!

因此,模板中不应包含 {{user.is_authenticated}},而应为 {{user.is_authenticated()}}

于 2010-11-29T00:04:21.203 回答