2012-03-01 9 views
2

すべてのビューに変数を渡すことをお勧めしますか?つまり、私の場合、外部キーdjango.contrib.auth.models.UserオブジェクトのUserProfileオブジェクトを渡したいと思います。私の意見がすべてUserProfileオブジェクトを取得してミドルウェアに入れる必要があるとは限りません。私は、次のような何かを行うことができますようにそれは(私はそれを示唆するソリューションオンラインのカップルを見てきました)ようだ:request.sessionを使用せずにDjango Middlewareのリクエストオブジェクトにカスタム変数を追加する

request.session['userprofile'] = userprofile_object 

私のUserProfileモデルは、これまで非直列化可能フィールドを持っている場合、私はこのために好きではありませんそれはrequest.sessionを破ります。

答えて

0

この提案は、userprofileオブジェクトは、ユーザーが既にログインしている場合のみ重要であるため、ログインしたユーザーをrequest.userで取得することができます。 このような逆でのForeignKeyキー関係を旅行することでUSERPROFILEを得ることが可能でなければなりません:

if request.user.is_authenticated(): 
    request.user.userprofile_object_set.all() #gets all related userprofile objects 
else: 
    #... 
+0

ええ、UserProfileオブジェクトを取得するには複数の方法があります。 UserProfile.objects.filter(user = request.user)を実行することもできますが、それは質問には答えません。どのようにビューに渡しますか? – jsw

+0

おそらく私はあなたの質問を誤解しているかもしれません。すべてのビューが最初の引数として渡された要求を取得するため、ビューをビューに「渡す」必要はありません。すべてのテンプレートでuserprofileの変数を使用できるようにするには、userprofile_objectを変数に入れるカスタムcontext_processorを検討してください。 – Jingo

+0

'prof = request.user.userprofile_object_set.all()[0]'は呼び出されるたびにデータベースにヒットすると思いますか? – user9876

3

あなたはAuthenticationMiddlewareを有効にしている場合、あなたはすべてのあなたの意見にuserオブジェクトを持つことになります。プロファイルを取得するには、user.get_profileに電話するだけです。たとえば、プロファイルのIDを出力するには、{{ user.get_profile.id }}とします。

ユーザーオブジェクトのget_profile関数を毎回呼び出したくない場合は、任意の項目をリクエストに追加できます。あなたは、単に

request.user_profile = request.user.get_profile() 

それからちょうどあなたのsettings.pyにそのミドルウェアを登録し、あなたが行くように良いことがありますを設定する新しいミドルウェアを作成します。私は過去にこのメソッドを使用して、ユーザージオロケーションデータをリクエストオブジェクトに固定しました。

関連する問題