1

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

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 の DRY 倫理に反するようです。どうすれば自分自身を繰り返すことでこれを行うことができますか?

編集:おそらくユーザーは悪い例でした。

データベースからオブジェクトのリストを取得したい場合、

items = Item.objects.all()

そしてそれらをすべてのページにリストします。

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

4

3 に答える 3

3

ユーザー 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))
于 2009-07-07T09:39:47.377 に答える
1

request.user はどうですか?

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

とにかく、まだ django で利用できない場合は、django.contrib.sessions.middleware.SessionMiddleware または django.contrib.auth.middleware.AuthenticationMiddleware のようなミドルウェア クラスを作成することをお勧めします。そのクラスは、ビューに送信される前にリクエストの詳細を変更します。

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

于 2009-07-07T10:38:26.917 に答える
1

そのようなものには、カスタム テンプレート タグを使用する必要があります。カスタムタグで必要なデータを取得して、テンプレートに送信できます。覚えておく必要があるのは、タグを使用するテンプレート ファイルにタグをロードすることだけです。

于 2009-07-07T21:16:17.103 に答える