35

ユーザーが投稿できる小さな会社の小さなイントラネット サイトに取り組んでいます。人々がメールアドレスを入力するだけで、一意のログイン URL が送信され、将来のリクエストのために常に識別される Cookie が設定される、非常に単純な認証メカニズムを想像しました。

私のテンプレート設定では base.html があり、他のページはこれを拡張しています。base.html にログインまたは登録ボタンを表示したいのですが、必要な変数が常にコンテキストの一部であることを確認するにはどうすればよいですか? 各ビューは好きなようにコンテキストを設定しているようで、グローバルなコンテキスト人口はありません。各コンテキスト作成にユーザーを含めずにこれを行う方法はありますか?

または、コンテキストを適切にセットアップするために独自のカスタム ショートカットを作成する必要がありますか?

4

8 に答える 8

46

すでにinがあり、ビューで使用している場合は、ユーザーオブジェクトのコンテキストプロセッサを作成する必要はありません。"django.core.context_processors.auth"TEMPLATE_CONTEXT_PROCESSORS RequestContext

django 1.4または最新のものを使用している場合、モジュールはに移動されましたdjango.contrib.auth.context_processors.auth

于 2009-06-30T16:14:29.420 に答える
33

@Ryan: プリプロセッサに関するドキュメントは少し小さい

@Staale: ビューでテンプレートを呼び出すたびにコンテキストにユーザーを追加する、DRY

解決策は、プリプロセッサを使用することです

A : 設定に追加します

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 }}
于 2008-11-06T16:05:03.300 に答える
20

各ビューで明示的に変数を設定する必要がないというより一般的な意味では、独自のcontext processorの作成を検討したいようです。

ドキュメントから:

コンテキスト プロセッサのインターフェイスは非常に単純です。これは、1 つの引数 HttpRequest オブジェクトを受け取り、テンプレート コンテキストに追加される辞書を返す単なる Python 関数です。各コンテキスト プロセッサは辞書を返す必要があります。

于 2008-09-03T12:31:58.703 に答える
3

ヒントはすべての答えにありますが、初心者のために、もう一度、「スクラッチ」から:

認証データはデフォルトで(ほとんど)テンプレートにあります-ちょっとしたトリックがあります:

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

RequestContextが使用されていない場合、このテンプレートコンテキスト変数は使用できません。

于 2012-08-09T07:28:58.870 に答える
2

認証をDjango 認証スキームにフックできる場合は、request.user.

これは、呼び出しの場合であり、Cookie の内容に基づいている必要があると思いauthenticate()ますlogin()

編集: @Staale -すべてのテンプレートが表示されるように、常にコンテキストにlocals()トリックを使用します。そうでなければ、それほど単純ではないと思います。requestrequest.user

于 2008-09-03T12:28:34.810 に答える
2

@Dave テンプレートで {{user.username}} を使用するには、通常のマップ/ハッシュではなく requestcontext を使用する必要があります: http://www.djangoproject.com/documentation/templates_python/#subclassing-context-リクエストコンテキスト

したがって、テンプレート エンジンがチェックするグローバルはないと思います。

しかし、RequestContext には、問題を解決するために調べることができる事前設定クラスがいくつかあります。ありがとう。

于 2008-09-03T12:33:31.583 に答える
1

デフォルトで可能です。次の手順を実行して、設定にコンテキスト「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 を参照してください

于 2011-01-27T11:15:12.407 に答える