web-dev-qa-db-ja.com

Djangoテンプレートでuser.is_authenticatedに問題がある

私がこれを以前に尋ねたときにあなたが私を助けようとしたならば、すみません。何らかの理由で追加情報を編集することが許可されていなかったため、その質問を削除する必要がありました。

Djangoウェブサイト。すべてが動作します。ビュー、モデル、URLなどがすべて設定されています。ユーザーは登録、ログイン、ログアウトできます。私が持っている問題は、このコードのビットです:

{% 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がtrueである。

ログイン要求に関連するビューは次のとおりです。

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))
29
Xonal

認証コンテキストプロセッサが有効になっている場合、userは既にテンプレートコンテキストにあり、次のことができます。

{% if user.is_authenticated %}

テンプレートのrequestにアクセスする場合は、 request context processor が有効になっていることを確認してください。

あなたの質問では、render_to_responseを使用しています。 Django 1.3以降、render_to_responseの代わりにrenderを使用したほうがよい。RequestContext(request)render_to_responseを使用すると、 Django <= 1.9、ただしDjango 1.10以降では、コンテキストプロセッサを動作させるにはrenderショートカットを使用する必要があります。

return render(request, 'template/login.html', context)
44
Alasdair

Django 1.1から_is_authenticated_が@ propertyで装飾され、動作が異なることに注意してください。

[〜#〜] unauthenticated [〜#〜]ユーザーが{{user.is_authenticated}}を呼び出した結果:

CallableBool(True)(Django <1.10の場合はTrueでした)

[〜#〜] authenticated [〜#〜]ユーザー呼び出し{{user.is_authenticated}}の結果:

CallableBool(False)(Django <1.10の場合はFalseでした)

truefalseなどのjavascript値に渡す必要がある場合は、フィルター_|yesno:"true,false"_を適用してそれを行うことができます。

_<script language="javascript"> 
var Django_USER = "{{user.is_authenticated|yesno:"true,false"}}";
</script>
_
7
andilabs