質問
私は、現在のユーザーでログインして取得するいくつかのコードを持っています。
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にそれらを一覧表示します。
私は、そのコードを書いて、すべてのビューのテンプレートにリストを渡す必要があります。それは、すべてのテンプレートにそのリストを利用できるようになります一度か私はいくつかのコードを書くことができますか?
解決
あなたはのためのカスタムテンプレートタグを使用する必要がありますそんな感じ。あなたは、カスタムタグに必要なデータをフェッチし、テンプレートにそれを送ることができます。あなたが覚えておく必要があるのは、あなたがそれを使用するつもりテンプレートファイルのタグを上にロードすることです。
他のヒント
ユーザーIDが既にセッション内に存在します。そのように、あなたはそれを周りに渡す維持する必要はありません。
{{ request.session._auth_user_id }}
これは動作するはずですが、あなたはあなたの設定ファイルにあなたのTEMPLATE_CONTEXT_PROCESSORSでこれを追加する必要があります:
django.core.context_processors.request
あなたのrender_to_responseでは、パラメータとして、要求を追加する必要があると思います。たとえばます:
return render_to_response('test.html',{}, context_instance=RequestContext(request))
何から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ことができます。