2009-07-07 9 views
1

現在ログインしているユーザーを取得するコードがあります。Djangoビューを保持するDRY

userID = request.session.get("_auth_user_id") 
    if userID: 
     loggedin_user = User.objects.get(pk=int(userID)) 
    else: 
     loggedin_user = None 

すべてのページにユーザー名を表示します。私はすべてのビューでコードを入れています現時点では

、すべてのテンプレートにユーザーオブジェクトを渡す

return render_to_response('index.html', {loggedin_user}) 

これは、DjangoのD.R.Yの倫理に反するように思われます。私はこれを自分自身で繰り返すことができますか?

EDIT:おそらく、ユーザーは悪い例でした。私は、データベースからオブジェクトのリストを取得したい場合はどう

items = Item.objects.all() 

とeverypageにそれらを一覧表示します。

このコードを記述して、すべてのビューのテンプレートにリストを渡す必要がありますか。または、そのリストをすべてのテンプレートで使用できるようにするコードを一度書くことはできますか?

答えて

1

custom template tagを使用してください。必要なデータをカスタムタグで取得し、テンプレートに送信することができます。

+0

を参照してください。その後、20個のテンプレートに{%load my _template_tag%}があります...これはDRYではありません –

+3

それを頻繁に使用している場合は、親テンプレートの中で拡張している可能性があります。そのため、1つの場所にしか配置できません。そうでない場合は、おそらくカスタムコンテキストプロセッサを使用できます。 –

3

セッション内にユーザーIDが既に存在します。そのようなものとして、あなたはそれを周りに渡す必要はありません。

動作するはず
{{ request.session._auth_user_id }} 

ていますが、設定ファイルにあなたのTEMPLATE_CONTEXT_PROCESSORSでこれを追加する必要があります。あなたのrender_to_responseで

django.core.context_processors.request 

、あなたは、パラメータとして、要求を追加する必要があると思います。例:

return render_to_response('test.html',{}, context_instance=RequestContext(request)) 
+0

申し訳ありませんが、私はタイプミスをしました テンプレート全体にUserオブジェクトだけを渡したいと思いますが、idだけでなく –

+0

また、ユーザーをセッションに追加した場合、ユーザー全体が既に存在しているため、そのフィールドにアクセスできるはずです。 – AlbertoPL

+1

@Cato:django.core.context_processors.authをあなたの設定に入れると、{{user}}はどんなテンプレートでも利用できます.TEMPLATE_CONTEXT_PROCESSORS、匿名ユーザーはNoneではありません。AnonymousUserのインスタンスです。 http://docs.djangoproject.com/en/dev/topics/auth/#authentication-data-in-templates –

1

request.userはどうですか?それはジャンゴですでに利用できなかった場合

if request.user.is_authenticated(): 
    name = request.user.username 
else: 
    name = "Anonymous" 

とにかく、私はちょうどdjango.contrib.sessions.middleware.SessionMiddlewareまたはdjango.contrib.auth.middleware.AuthenticationMiddlewareなどのミドルウェアクラスを書くためにあなたをお勧めしたいです。そのクラスは、ビューに送信される前に要求の詳細を変更します。

ビュー単位で必要な場合は、その小さなビットを行うデコレータと、必要なビューを@decoratorで記述することができます。

関連する問題