Come accedere al profilo utente in un template Django?


89

Sto memorizzando alcune informazioni aggiuntive per utente utilizzando il file AUTH_PROFILE_MODULE.

Possiamo accedere all'utente in un template Django usando {{ request.user }}ma come accediamo ai campi del profilo dato che il profilo è accessibile solo tramite una funzione user.get_profile()?

È davvero necessario passare ogni volta esplicitamente il profilo nel modello?

Risposte:


136

Usa {{ request.user.get_profile.whatever }}. Il linguaggio di creazione dei modelli di Django chiama automaticamente le cose che possono essere richiamate, in questo caso il .get_profile()metodo.


3
Vedi docs.djangoproject.com/en/dev/topics/templates/#variables Le regole sono molto interessanti.
S.Lott

3
Questo è deprecato in Django 1.5 e versioni successive e non funziona in Django 1.7 e versioni successive. Vedi la risposta di Sacha Rau su come farlo nel Django moderno.
MichielB

27

Non so perché sia ​​diverso per me, ma devo usare {{user}} invece di {{request.user}}.


5
I documenti dicono ( docs.djangoproject.com/en/dev/topics/auth/… ) che puoi accedere all'utente semplicemente {{user}}, come dici tu.
Xiong Chiamiov

2
Il vero motivo per utilizzare {{user}} e non {{request.user}} è perché non includi il processore del contesto del modello per la richiesta. https://docs.djangoproject.com/en/dev/ref/templates/api/#django-core-context-processors-request
knightZeRo

4
Il collegamento è leggermente diverso per Django 1.10, ma l'idea è la stessa, django.template.context_processors.requestinserisce il requesttemplate in, mentre lo django.contrib.auth.context_processors.authinserisce usernel contesto. docs.djangoproject.com/en/1.10/ref/templates/api/…
Andrei-Niculae Petre

8

Sì, è possibile accedere al profilo dal modello utilizzando request.user.get_profile

Tuttavia c'è un piccolo avvertimento : non tutti gli utenti avranno profili, come nel mio caso con utenti admin. Quindi chiamare direttamente {{ request.user.get_profile.whatever }}dal modello causerà un errore in questi casi.

Se sei sicuro che tutti i tuoi utenti dispongano sempre di profili, puoi chiamare in sicurezza dal modello, altrimenti chiama get_profile()dall'interno di prova, tranne blocca nella tua vista e passalo al modello.


Questa risposta è fuorviante: non l'ho testata {{ request.user.get_profile.whatever }}, ma {{ request.user.get_profile }}funzionerà e può essere utilizzata per verificare se un profilo esiste o meno nelle versioni correnti. Vedi docs.djangoproject.com/en/dev/ref/templates/api/… . C'è una nota che cambierà nella versione di sviluppo, però, vedi il paragrafo sopra quello a cui ho collegato.
ralokt

@tkolar, cosa c'è esattamente di fuorviante qui? se l'utente non ha un profilo e stai chiamando get_profile.something che causerà un errore.
Sergey Golovchenko

4

Se stai usando Django> 1.5 non puoi più usare get_profile .

Se hai un'app legacy, dovresti rimuoverla AUTH_PROFILE_MODULE = 'myapp.profile'dal tuo filesettings.py .

Se usi models.OneToOneField(User)nella tua classe Profilo, puoi semplicemente usare

{{ request.user.profile.whatever }}

nel tuo modello Django


1
@AlexStewart vuoi dire che non abbiamo più bisogno della requesttastiera nella parte anteriore?
Luk Aron

3

Se aiuta qualcuno, ho usato quanto segue nel mio modello:

Nome utente: {{ user.username }}

Nome completo utente: {{ user.get_full_name }}

Gruppo di utenti: {{ user.groups.all.0 }}

E-mail: {{ user.email }}

Sessione iniziata alle: {{ user.last_login }}

Un risultato di esempio è come questo:

Utente: auditor ezio

Gruppo utenti: auditGroup

Nome utente: testUser03

E-mail: testuser03@auditor.com

Sessione iniziata alle ore 16 aprile 2018, 21:38

Grazie :)


1

Lavorando !

Nel tuo modello di profilo fornisci related_name

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

Quindi nell'uso del modello. Qui nome_azienda è il campo nella tabella del profilo

{{ request.user.user_profile.company_name }}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.