Wie greife ich in einer Django-Vorlage auf das Benutzerprofil zu?

88

Ich speichere einige zusätzliche Informationen pro Benutzer mithilfe von AUTH_PROFILE_MODULE.

Wir können in einer Django-Vorlage auf den Benutzer zugreifen, {{ request.user }}aber wie greifen wir auf Felder im Profil zu, da auf das Profil nur über eine Funktion user.get_profile()zugegriffen werden kann ?

Ist es wirklich erforderlich, das Profil jedes Mal explizit an die Vorlage zu übergeben?

Swaroop CH
quelle

Antworten:

136

Verwenden Sie {{ request.user.get_profile.whatever }}. Djangos Vorlagensprache ruft automatisch aufrufbare Dinge auf - in diesem Fall die .get_profile()Methode.

AdamKG
quelle
3
Siehe docs.djangoproject.com/de/dev/topics/templates/#variables Die Regeln sind sehr cool.
S.Lott
3
Dies ist in Django 1.5 und höher veraltet und funktioniert in Django 1.7 und höher nicht mehr. Siehe Sacha Raus Antwort, wie dies im modernen Django zu tun ist.
MichielB
27

Ich bin mir nicht sicher, warum es bei mir anders ist, aber ich muss {{user}} anstelle von {{request.user}} verwenden.

Rachel
quelle
5
In den Dokumenten heißt es ( docs.djangoproject.com/de/dev/topics/auth/… ), dass Sie auf den Benutzer einfach über {{user}} zugreifen können, wie Sie sagen.
Xiong Chiamiov
2
Der eigentliche Grund für die Verwendung von {{user}} und nicht {{request.user}} liegt darin, dass Sie den Vorlagenkontextprozessor für die Anforderung nicht einschließen. https://docs.djangoproject.com/de/dev/ref/templates/api/#django-core-context-processors-request
knightZeRo
4
Der Link ist für Django 1.10 etwas anders, aber die Idee ist dieselbe: Die django.template.context_processors.requestEinfügung der requestIn-Vorlage und die django.contrib.auth.context_processors.authEinfügungen userim Kontext. docs.djangoproject.com/de/1.10/ref/templates/api/…
Andrei-Niculae Petre
8

Ja, es ist möglich, über die Vorlage mit request.user.get_profile auf das Profil zuzugreifen

Es gibt jedoch eine kleine Einschränkung : Nicht alle Benutzer haben Profile, was in meinem Fall bei Administratoren der Fall war. Ein direkter Aufruf direkt {{ request.user.get_profile.whatever }}von der Vorlage führt in solchen Fällen zu einem Fehler.

Wenn Sie sicher sind, dass alle Benutzer immer Profile haben, können Sie sicher von der Vorlage aus aufrufen. Andernfalls rufen Sie get_profile()in Ihrer Ansicht aus dem try-Except-Block auf und übergeben Sie ihn an die Vorlage.

Sergey Golovchenko
quelle
Diese Antwort ist irreführend - ich habe sie nicht getestet {{ request.user.get_profile.whatever }}, werde aber {{ request.user.get_profile }}funktionieren und kann verwendet werden, um zu überprüfen, ob in aktuellen Versionen ein Profil vorhanden ist oder nicht. Siehe docs.djangoproject.com/de/dev/ref/templates/api/… . Es gibt einen Hinweis, dass sich dies in der Entwicklungsversion ändern wird. Siehe jedoch den Absatz über dem, auf den ich verlinkt habe.
Ralokt
@tkolar, was genau ist hier irreführend? Wenn der Benutzer kein Profil hat und Sie get_profile.something aufrufen, das einen Fehler verursacht.
Sergey Golovchenko
4

Wenn Sie Django> 1.5 verwenden, können Sie es nicht mehr verwenden get_profile.

Wenn Sie eine Legacy-App haben, sollten Sie diese AUTH_PROFILE_MODULE = 'myapp.profile'aus Ihrer entfernen settings.py.

Wenn Sie models.OneToOneField(User)in Ihrer Profilklasse verwenden, können Sie einfach verwenden

{{ request.user.profile.whatever }}

in Ihrer Django-Vorlage

Sascha Rau
quelle
1
@AlexStewart meinst du wir brauchen die requestTastatur vorne nicht mehr ?
Luk Aron
3

Wenn es jemandem hilft, habe ich Folgendes in meiner Vorlage verwendet:

Nutzername: {{ user.username }}

Benutzer Vollständiger Name: {{ user.get_full_name }}

Benutzergruppe: {{ user.groups.all.0 }}

Email: {{ user.email }}

Sitzung begann um: {{ user.last_login }}

Ein Beispielergebnis sieht folgendermaßen aus:

Benutzer: Auditor ezio

Benutzergruppe: auditGroup

Benutzername: testUser03

E-Mail: [email protected]

Die Sitzung begann am 16. April 2018 um 21.38 Uhr

Vielen Dank :)

Mohammad
quelle
1

Arbeiten !

Geben Sie in Ihrem Profilmodell den verwandten Namen an

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

Dann in Vorlage verwenden. Hier ist Firmenname ein Feld in der Profiltabelle

{{ request.user.user_profile.company_name }}
Nids Barthwal
quelle