ユーザー セッションに格納された値を出力する必要があるカスタム タグを Django で作成していますが、カスタム タグ関数内からセッション オブジェクトにアクセスする方法が見つかりません。セッションオブジェクトをコンテキスト変数に手動で割り当てることなく、これを行う方法はありますか?
5 に答える
settings.py ファイルにリクエスト コンテキスト プロセッサを追加できるはずです。
TEMPLATE_CONTEXT_PROCESSORS = ("django.core.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
'django.core.context_processors.request',)
これは、カスタム ファイルを追加することなく、現在の回答と同じことを行います。
ある時点では便利なハックだったように思えたので、Sebastian を攻撃するつもりはありませんでしたが、奇妙なことに、12 月 24 日のブログ エントリで、Django のリリース マネージャーである James Bennett が、管理者のユーザー データへのアクセスに関する記事で、threadlocal の使用について次のように述べていました。ハック:
大きな免責事項: これらのタイプの機能には、非常に多くの潜在的な用途があります。それらの多くは間違っていてばかげているので、試してはいけません。... また、「スレッドローカル ハック」として知られている方法でこれらの機能を取得できると提案する人もときどき見かけます。これは基本的に request.user を魔法のようなグローバルに利用可能な変数に貼り付けることを含み、自分が何をしているのかわからない場合に使用するのは非常に悪いことです。また、自分が何をしているのかを知っていても、それを使用するのは一般的に非常に悪いことです. なぜなら、あなたはおそらく怠け者で、情報を適切に渡すことを保証したくないからです. したがって、「スレッドローカル」を使用してこれを行うように誰かが提案している場合は、その人を無視してください。
Sebastian を無視すべきだと言っているわけではありませんが、ベスト プラクティスとは見なされていないスレッドローカルを使用するのではなく、他の手段を追求する価値があるかもしれません。
カスタム コンテキスト プロセッサを使用してこれを行うことができます ( http://docs.djangoproject.com/en/dev/ref/templates/api/を参照) 。
この場合、settings.py ファイルと同じレベルに context_processors.py という名前の新しいファイルを作成します。
def add_session(request):
return {'session': request.session}
次に、settings.py ファイルに以下を追加します。
TEMPLATE_CONTEXT_PROCESSORS = ("django.core.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
'context_processors.add_session',)
カスタムタグで context['session'] を参照できるようになりました。
これは、次のコードのように、RequestContext が割り当てられてレンダリングされたテンプレートに対してのみ機能することに注意してください。
def test(request):
return render_to_response('test.html',{}, context_instance=RequestContext(request))
私はこれが便利だと思いました:http://code.djangoproject.com/wiki/CookBookThreadlocalsAndUser
ミドルウェアを使用してユーザー情報を取得し、ローカルスレッドで保存してから、タグ定義で使用できます。
django- annoying のrender_to デコレータを使用するのが最良の選択肢のようです ( stackoverflow に関する別の質問に見られるように)