Djangoテンプレートのユーザープロファイルにアクセスする方法


88

を使用して、ユーザーごとの追加情報をいくつか保存していAUTH_PROFILE_MODULEます。

を使用してDjangoテンプレートでユーザーにアクセスできますが{{ request.user }}、プロファイルは関数を介してのみアクセスできるので、プロファイルのフィールドにどのようにアクセスしますuser.get_profile()か?

毎回明示的にプロファイルをテンプレートに渡す必要があるのですか?

回答:


136

を使用し{{ request.user.get_profile.whatever }}ます。Djangoのテンプレート言語は、呼び出し可能なもの(この場合は.get_profile()メソッド)を自動的に呼び出します。


3
docs.djangoproject.com/en/dev/topics/templates/#variablesを参照してください。ルールは非常に優れています。
S.Lott、2009年

3
これはDjango 1.5以降では非推奨であり、Django 1.7以降では機能しません。最新のDjangoでこれを行う方法については、Sacha Rauの回答を参照してください。
MichielB

27

なぜ私にとってそれが異なるのかはわかりませんが、{{request.user}}ではなく{{user}}を使用する必要があります。


5
ドキュメントは言う(docs.djangoproject.com/en/dev/topics/auth/…)と言うように、{{user}}だけでユーザーにアクセスできます。
Xiong Chiamiov、2010

2
{{request.user}}ではなく{{user}}を使用する本当の理由は、リクエストにテンプレートコンテキストプロセッサを含めないためです。https://docs.djangoproject.com/en/dev/ref/templates/api/#django-core-context-processors-request
knightZeRo

4
リンクは、Djangoの1.10のため多少異なりますが、考え方は同じであるが、django.template.context_processors.request挿入requestしながら、テンプレート内django.contrib.auth.context_processors.authの挿入userコンテキストインチ docs.djangoproject.com/en/1.10/ref/templates/api/...
アンドレイ・ニクラエペトレ

8

はい、request.user.get_profileを使用してテンプレートからプロファイルにアクセスできます

ただし、小さな注意点があります。すべてのユーザーがプロファイルを持つわけではありません。これは、私の場合は管理ユーザーです。その{{ request.user.get_profile.whatever }}ため、このような場合、テンプレートから直接呼び出すと エラーが発生します。

すべてのユーザーが常にプロファイルを持っていると確信している場合は、テンプレートから呼び出しても安全です。それ以外の場合get_profile()は、ビューのtry-exceptブロック内から呼び出し、テンプレートに渡します。


この答えは誤解を招く-私はテストしていませんが{{ request.user.get_profile.whatever }}{{ request.user.get_profile }}動作し、現在のバージョンにプロファイルが存在するかどうかを確認するために使用できます。docs.djangoproject.com/en/dev/ref/templates/api/…を参照してください。ただし、開発バージョンでは変更されることに注意してください。リンク先の上の段落を参照してください。
ralokt、2011年

@tkolar、ここで正確に何が誤解を招くのですか?ユーザーにプロファイルがなく、エラーを引き起こすget_profile.somethingを呼び出している場合。
セルゲイゴロフチェンコ

4

Django> 1.5を使用している場合は、使用できなくなりますget_profile

レガシーアプリがある場合は、AUTH_PROFILE_MODULE = 'myapp.profile'から削除する必要がありますsettings.py

あなたが使用している場合はmodels.OneToOneField(User)、あなたのプロフィールクラスで、あなたは簡単に使用することができます

{{ request.user.profile.whatever }}

Djangoテンプレート


1
@AlexStewart requestキーボードはもう必要ないということですか?
Luk Aron、

3

それが誰かを助けるなら、私は私のテンプレートで以下を使いました:

ユーザー名: {{ user.username }}

ユーザーのフルネーム: {{ user.get_full_name }}

ユーザー・グループ: {{ user.groups.all.0 }}

Eメール: {{ user.email }}

セッション開始: {{ user.last_login }}

結果の例は次のとおりです。

ユーザー:監査人ezio

ユーザーグループ:auditGroup

ユーザー名:testUser03

メール:testuser03@auditor.com

セッションは2018年4月16日21:38に開始

ありがとう:)


1

働いてる!

プロファイルモデルで、related_nameを指定します

user = models.OneToOneField(AUTH_USER_MODEL, related_name="user_profile", on_delete=models.CASCADE)

次にテンプレートで使用します。ここで、company_nameはプロファイルテーブルのフィールドです

{{ request.user.user_profile.company_name }}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.