35

很抱歉,当我早些时候问这个问题时,如果你试图帮助我。不得不删除该问题,因为出于某种原因不允许我编辑其他信息。

我正在我的 django 网站上实现用户身份验证。一切正常。我的views、models、urls等都设置好了。用户可以注册、登录、注销。我遇到的问题是这段代码:

{% if request.user.is_authenticated %}
      <li><a href="/logout">Log Out</a></li>
      {% else %}
      <li><a href="/login">Log In</a></li>
      {% endif %}

即使我已登录,它仍然显示“登录”作为选项而不是“注销”。但是,如果我单击该链接,它会将我重定向到 /profile 因为这是视图告诉它在我登录后执行的操作。所以,很明显它知道我已登录,但模板不是readint user.is_authenticated 为真。

与登录请求相关的视图是:

def LoginRequest(request):
    if request.user.is_authenticated():
        return HttpResponseRedirect('/profile/')
    if request.method == 'POST':
        form = LoginForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data['username']
            password = form.cleaned_data['password']
            profile = authenticate(username=username, password=password)
            if profile is not None:
                login(request, profile)
                return HttpResponseRedirect('/profile/')
            else:
                return render_to_response('template/login.html', {'form': form}, context_instance=RequestContext(request))
        else:
            return render_to_response('template/login.html', {'form': form}, context_instance=RequestContext(request))
    else:
        ''' user is not submitting the form, show them login form ''' 
        form = LoginForm()
        context = {'form': form}
        return render_to_response('template/login.html', context, context_instance = RequestContext(request))
4

2 回答 2

57

如果启用了身份验证上下文处理器,则user已经在模板上下文中,您可以执行以下操作:

{% if user.is_authenticated %}

如果您想request在模板中访问,请确保您已启用请求上下文处理器

在您的问题中,您正在使用render_to_response. 从 Django 1.3 开始,最好render使用render_to_response. 在 Django <= 1.9 中使用render_to_responsewithRequestContext(request)有效,但从 Django 1.10 开始,render如果您希望上下文处理器工作,则必须使用快捷方式。

return render(request, 'template/login.html', context)
于 2013-06-10T20:30:04.347 回答
7

请注意,由于 Django 1.10使用@property进行is_authenticated装饰,并且它的行为有所不同。

对于UNAUTHENTICATED用户调用 {{user.is_authenticated}} 结果:

CallableBool(True)(在 Django < 1.10 时是这样True

对于AUTHENTICATED用户调用 {{user.is_authenticated}} 结果:

CallableBool(False)(在 Django < 1.10 时是这样False

如果您需要将例如传递给您的javascript值,true或者false您可以通过应用过滤器来完成|yesno:"true,false"

<script language="javascript"> 
var DJANGO_USER = "{{user.is_authenticated|yesno:"true,false"}}";
</script>
于 2017-05-12T22:02:21.787 回答