0

コードのこの部分は、私の Web ページのインデックスを表します。例: 127.0.0.1:8000/

def IndexView(request):
    try:
        profile = request.user.get_profile() 
    except User.DoesNotExist:
        return render_to_response('index.html',
                              {'request': request,},
                              context_instance=RequestContext(request))

    return render_to_response('index.html',
                  {'request': request, 'profile' : profile},
                  context_instance=RequestContext(request))  

デバッグ時にまだこのエラーが発生するのはなぜですか?

/ 'AnonymousUser' オブジェクトの AttributeError に属性 'get_profile' がありません

前もって感謝します

4

6 に答える 6

5

このチェックを追加する必要があります:

from django.shortcuts import render

def index_view(request):

    if request.user.is_authenticated():
        profile = request.user.get_profile()
        return render(request,'index.html',{'profile': profile})
    else:
        return redirect('login/')

または、組み込みのデコレータを使用して、ビューがログインしているユーザーでのみ呼び出されるようにすることもできます。

from django.contrib.auth.decorators import login_required
from django.shortcuts import render

@login_required
def index_view(request):

    profile = request.user.get_profile()
    return render(request,'index.html',{'profile': profile})

login_requiredデコレータを使用する場合はLOGIN_URL、サイトのログイン フォームを処理するビューを指す設定があることを確認する必要があります。デフォルトでは、これは/accounts/login/

CamelCaseは通常Pythonのクラス用であるため、メソッド名を小文字に変更しました。また、同じテンプレートをレンダリングしているため、2 つの return ステートメントは必要ありません。代わりに、index.htmlテンプレートで次のことができます。

{% if profile %}
    You have a profile!
{% else %}
    You don't
{% endif %}

認証に関するヒントとコツは、ドキュメントの認証エントリに記載されています。

于 2012-08-30T02:17:44.233 に答える
0

エラーが予想されUser.DoesNotExistますが、代わりにコードがAttributeError. これは、request.userが実際のオブジェクト (オブジェクト) であるためです。AnonymousUserオブジェクトにアクセスしてもエラーは発生しませんが、AnonymousUserにはプロファイルがありません。

代わりにデコレータを使用する@login_requiredか、 をキャッチするAttributeErrorか、実際に がスローされるようにコードを調整してくださいUser.DoesNotExist

于 2012-08-30T02:09:16.860 に答える
0

プロファイルを取得する前に、ユーザーが認証されているかどうかを確認する必要がありますget_profile。コードをかなり単純化することもできます。

def IndexView(request):
    profile = request.user.is_authenticated() and request.user.get_profile() 

    return render_to_response('index.html',
                              {'request': request, 'profile': profile},
                              context_instance=RequestContext(request))

Userwith は常に存在するため、except は必要ありません。

于 2012-08-30T02:09:52.600 に答える
0

ユーザーが現在ログインしていないためです。 get_profile を呼び出すと、実際のユーザーではないため get_profile メソッドを持たない AnonymousUser と呼ばれる Django によって提供されるデフォルトのユーザーで呼び出されます。私が想定している例外をスローしないため、エラーが発生します。ログイン後に同じことを試してみてください。問題ないはずです。

于 2012-08-30T01:51:13.757 に答える
0

この特定のユーザーがログインしていないため、このエラーが発生しています。

エラーを防ぐには@login_required、ビューのすぐ上でデコレータを使用します。

from django.contrib.auth.decorators import login_required

@login_required
def IndexView(request):
    ...

また:

def IndexView(request):
    if request.user.is_authenticated(): #check to use if user is logged in
        try:
            profile = request.user.get_profile() 
        except User.DoesNotExist:
            return render_to_response('index.html',
                              {'request': request,},
                              context_instance=RequestContext(request))

        return render_to_response('index.html',
                      {'request': request, 'profile' : profile},
                      context_instance=RequestContext(request))  
于 2012-08-30T01:56:26.990 に答える
-1

念のために言っておきますが、これはあまりドライなコードではありません。

それをチェックしてください:

def index_view(request):
    context_data = {'request': request}
    try:
        context_data.update('profile': request.user.get_profile())
    except AttributeError:
        pass

    return render_to_response('index.html', context_data,
         context_instance=RequestContext(request))  

また、リクエストがまだコンテキストに含まれていないことを再確認します。ここで具体的に文脈に入れる必要はないかもしれません。

編集: context_data を render_to_response に渡すのを忘れました。例を更新しました。

于 2012-08-30T02:11:54.443 に答える