2012-04-15 4 views
9

私の見解では、{{request.user.username}}はrequest.user.usernameを出力できます。現れる。これを簡単にするために、私は関数からロジックを削除しました。そして、render_to_response & RequestContextをインポートしています。Django 1.4 - {{request.user.username}}はテンプレートにレンダリングしません

from django.shortcuts import render_to_response 
from django.template import RequestContext 

@login_required 
@csrf_protect 
def form(request): 
    print request.user.username 
    data = {} 
    return render_to_response('form.html', data, context_instance=RequestContext(request)) 

私の設定はsettings.pyに問題があります。 mentioned in the documentationとしてあなたのヘルプ -

答えて

37

を事前に

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    # Uncomment the next line for simple clickjacking protection: 
    # 'django.middleware.clickjacking.XFrameOptionsMiddleware', 

INSTALLED_APPS = (
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.sites', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    'django.contrib.admin', 
    'django.contrib.admindocs', 
    'src', 
) 

おかげで、認証されたユーザのオブジェクトはテンプレートにuser変数内に格納されています。

{% if user.is_authenticated %} 
    <p>Welcome, {{ user.get_username }}. Thanks for logging in.</p> 
{% else %} 
    <p>Welcome, new user. Please log in.</p> 
{% endif %} 

UserインスタンスまたはAnonymousUserインスタンスのいずれかをテンプレートRequestContext、現在ログインしているユーザをレンダリングする、テンプレート変数{{ user }}に格納されている:上記の説明は次の例が含まれ

編集:この古い回答を掘り下げた@bufferのおかげで、最新の状態で更新しました。最初に書かれたとき、Django 1.4(2012年3月末にリリースされた)の1か月も経たないうちに、それは正しいものでした。しかし、Django 1.5以降、ユーザ名を取得する適切な方法は、ユーザモデルのインスタンスに対してget_username()を呼び出すことです。これは、Userクラスをスワップする能力(およびユーザ名としてカスタムフィールドを持つ)のために追加されました。

+0

私はテンプレートにユーザーオブジェクトを渡すことができますが、ログインしたユーザーは要求によってアクセスできるはずはありませんか?リクエストはテンプレートからはアクセスできないが、ビュー内にあるようだ。 – Emile

+0

おもしろいです。これは正しい - {{request.user.username}}(以前のプロジェクトで使用した)の代わりに、{{user.username}}が動作します。助けてくれてありがとう@タデック! – Emile

+0

'user.username'を' user.username'よりも使用することが望ましいです:https://docs.djangoproject.com/en/dev/ref/contrib/auth/#django.contrib.auth.models.User.get_username – Medorator

5

RequestContextTEMPLATE_CONTEXT_PROCESSORSのドキュメントをご覧ください。

テンプレートのコンテキストにrequestを追加する場合は、TEMPLATE_CONTEXT_PROCESSORSの設定にdjango.core.context_processors.requestを含める必要があります。それはデフォルトではありません。

しかしTadeckが彼の答えで指摘したようにデフォルトの設定を使用している場合django.contrib.auth.context_processors.authTEMPLATE_CONTEXT_PROCESSORSのデフォルトリストの一部であることからuserは、すでに利用可能です。

+0

ブライアンの説明をありがとう。それが私が見逃していた情報です。 TEMPLATE_CONTEXT_PROCESSORSがデフォルトプロジェクトから削除されましたか?私はそれらを追加したことをちょっと忘れているかもしれませんが、それはしばらくありました。 – Emile

+0

@EmilePetrone私は現在のstartprojectコマンドが 'TEMPLATE_CONTEXT_PROCESSORS'でsettings.pyを作成するとは思わない。それは一度にあるかもしれませんが、わかりません。 –

+0

@BrianNeal:私はテンプレートにユーザーを渡したくありません。永久に無効にする方法はありますか? – user1050619

関連する問題