Django テンプレート コンテキストにユーザーを常に含めます
-
09-06-2019 - |
質問
私は、ユーザーが投稿できる小さな会社の小さなイントラネット サイトに取り組んでいます。私は、ユーザーが自分の電子メール アドレスを入力するだけで、固有のログイン URL が送信され、将来のリクエストに備えて常にユーザーを識別する Cookie を設定する、非常に単純な認証メカニズムを想像しました。
私のテンプレート設定にはbase.htmlがあり、他のページはこれを拡張しています。Base.html にログインまたは登録ボタンを表示したいのですが、必要な変数が常にコンテキストの一部であることを確認するにはどうすればよいですか?各ビューが好きなようにコンテキストを設定しているだけのようで、グローバルなコンテキストの母集団は存在しません。各コンテキストの作成にユーザーを含めずにこれを行う方法はありますか?
それとも、コンテキストを適切に設定するには独自のカスタム ショートカットを作成する必要がありますか?
解決
各ビューで変数を明示的に設定する必要がないというより一般的な意味では、独自の変数を作成することを検討したいように思えます。 コンテキストプロセッサ.
ドキュメントから:
コンテキスト プロセッサには非常に単純なインターフェイスがあります。これは、1 つの引数である HttpRequest オブジェクトを受け取り、テンプレート コンテキストに追加される辞書を返す単なる Python 関数です。各コンテキスト プロセッサは辞書を返す必要があります。
他のヒント
がある 必要なし すでにユーザーオブジェクトがある場合は、ユーザーオブジェクトのコンテキストプロセッサを作成します。 "django.core.context_processors.auth"
で TEMPLATE_CONTEXT_PROCESSORS
そして 使用している場合 RequestContext
あなたの見解では。
django 1.4 以降を使用している場合、モジュールは次の場所に移動されています。 django.contrib.auth.context_processors.auth
@ライアン:プリプロセッサに関するドキュメントは少し少ない
@スターレ:ビュー内のテンプレートを呼び出すたびにユーザーをコンテキストに追加する、DRY
解決策はプリプロセッサを使用することです
あ:設定に追加します
TEMPLATE_CONTEXT_PROCESSORS = (
'myapp.processor_file_name.user',
)
B:myapp/processor_file_name.py に挿入します
def user(request):
if hasattr(request, 'user'):
return {'user':request.user }
return {}
これからは、テンプレートでユーザー オブジェクトの機能を使用できるようになります。
{{ user.get_full_name }}
ヒントはすべての答えにありますが、初心者のためにもう一度「最初から」説明します。
認証データは(ほぼ)デフォルトでテンプレート内にありますが、ちょっとしたトリックがあります。
で views.py
:
from django.template import RequestContext
...
def index(request):
return render_to_response('index.html',
{'var': 'value'},
context_instance=RequestContext(request))
で index.html
:
...
Hi, {{ user.username }}
var: {{ value }}
...
ここから: https://docs.djangoproject.com/en/1.4/topics/auth/#authentication-data-in-templates
このテンプレート コンテキスト変数は、 リクエストコンテキスト 使用されていません。
@dave {{user.username}}をテンプレートで使用するには、通常のマップ/ハッシュではなく、requestcontextを使用する必要があります。 http://www.djangoproject.com/documentation/templates_python/#subclassing-context-requestcontext
したがって、テンプレートエンジンがチェックするグローバルは存在しないと思います。
ただし、RequestContext には、問題を解決するために調べることができる事前設定クラスがいくつかあります。ありがとう。
認証をフックできる場合は、 Django 認証スキーム 使えるようになります request.user
.
これは電話するだけでいいと思います authenticate()
そして login()
Cookie の内容に基づいて。
編集:@Staale - 私はいつも locals()
騙す すべてのテンプレートで確認できるようにコンテキスト用に request
など request.user
. 。そうでない場合は、それほど単純ではないと思います。
デフォルトで可能です。次の手順を実行して、設定にコンテキスト「django.contrib.auth.context_processors.auth」が追加されていることを確認してください。デフォルトでは settings.py に追加されるので、次のようになります
TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.core.context_processors.auth',)
そして、次のようにユーザーオブジェクトにアクセスできます。
{% if user.is_authenticated %}
<p>Welcome, {{ user.username }}. Thanks for logging in.</p>
{% else %}
<p>Welcome, new user. Please log in.</p>
{% endif %}
詳細については、こちらを参照してください http://docs.djangoproject.com/en/1.2/topics/auth/#authentication-data-in-templates