' is_authenticated'仍然总是在模板中返回false

时间:2014-08-31 23:47:52

标签: django django-templates django-views

这是继我的其他question之后,因为它可能需要不同的答案。

我模板中的代码总是返回false:

   {% if request.user.is_authenticated %}
      <p>I'm logged in</p>
   {% else %}
      <p>I am anonymous</p>
   {% endif %}

我从文档中了解到我需要在settings.py的TEMPLATE_CONTEXT_PROCESSORS中包含“django.contrib.auth.context_processors.auth”,所以我这样做了如下:

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.contrib.messages.context_processors.messages",
    "django.contrib.auth.context_processors.auth", #Added
)

至于我的views.py,我使用的是render_to_response(),但觉得这可能会导致问题。我还需要在上下文中从数据库传递用户,但添加了第三个参数context_instance=RequestContext(request)

def public_profile(request, username_in_url):
    user = User.objects.get(username = username_in_url)
    context = {
        'user': user,       
    }

    return render_to_response('public_profile.html', context, context_instance=RequestContext(request))

为什么即使用户已登录,request.user.is_authenticated仍会返回false?在views.py中使用相同的方法正确,例如

if request.user.is_authenticated():
        return render_to_response('public_profile.html', context)
    else:
        return render_to_response('public_profile_anon.html', context)

1 个答案:

答案 0 :(得分:6)

django.contrib.auth.context_processors.auth的{​​{3}}表示此上下文处理器定义了两个变量:userpermsuser

  

表示当前登录用户(或auth.User实例的AnonymousUser实例(如果客户端未登录)。

因此,虽然在Python代码中您可以访问request.user来执行检查,但在模板中它是user

您的具体案例的问题在于,您还会根据user传递定义username_in_url的字典。这与django.contrib.auth.context_processors.auth定义的变量冲突。

所以:

  1. 更改字典(您将其命名为context),以便user具有不同的名称。 (并在模板中更改对它的引用。)

  2. 更改模板以检查{% if user.is_authenticated %}