Bir Django şablonundaki kullanıcı profiline nasıl erişilir?


89

Kullanarak bazı ek kullanıcı bilgileri depoluyorum AUTH_PROFILE_MODULE.

Kullanıcıya bir Django şablonunu kullanarak {{ request.user }}erişebiliriz, ancak profile yalnızca bir işlev aracılığıyla erişilebildiği için profildeki alanlara nasıl erişebiliriz user.get_profile()?

Profilin her seferinde şablona açıkça geçirilmesi gerçekten gerekli mi?

Yanıtlar:


136

Kullanın {{ request.user.get_profile.whatever }}. Django'nun şablon dili otomatik olarak çağrılabilir şeyleri çağırır - bu durumda, .get_profile()yöntem.



3
Bu, Django 1.5 ve sonraki sürümlerde kullanımdan kaldırılmıştır ve Django 1.7 ve sonraki sürümlerde çalışmaz. Bunu modern Django'da nasıl yapacağınıza dair Sacha Rau'nun cevabına bakın.
MichielB

27

Benim için neden farklı olduğundan emin değilim, ancak {{request.user}} yerine {{user}} kullanmam gerekiyor.


5
Dokümanlar ( docs.djangoproject.com/en/dev/topics/auth/… ), dediğiniz gibi kullanıcıya yalnızca {{user}} ile erişebileceğinizi söylüyor.
Xiong Chiamiov

2
{{Request.user}} yerine {{user}} kullanmanın gerçek nedeni, istek için şablon bağlam işlemcisini dahil etmemenizdir. https://docs.djangoproject.com/en/dev/ref/templates/api/#django-core-context-processors-request
knightZeRo

4
Bağlantı Django 1.10 için biraz farklıdır, ama fikir aynı, django.template.context_processors.requestekler requestşablonda iken django.contrib.auth.context_processors.authekler userbağlamda. docs.djangoproject.com/en/1.10/ref/templates/api/…
Andrei-Niculae Petre

8

Evet, request.user.get_profile kullanılarak şablondan profile erişmek mümkündür.

Ancak küçük bir uyarı var : tüm kullanıcıların profilleri olmayacak, benim durumumda yönetici kullanıcılar. Yani doğrudan arıyorum {{ request.user.get_profile.whatever }} şablondan , bu gibi durumlarda bir hataya neden olacaktır.

Tüm kullanıcılarınızın her zaman profilleri olduğundan eminseniz, şablondan aramak güvenlidir, aksi takdirde get_profile()görünümünüzdeki try hariç bloğu içinden arayın ve şablona aktarın.


Bu cevap yanıltıcıdır - Test etmedim {{ request.user.get_profile.whatever }}, ancak {{ request.user.get_profile }}çalışacağım ve mevcut sürümlerde bir profilin var olup olmadığını kontrol etmek için kullanılabilir. Docs.djangoproject.com/en/dev/ref/templates/api/… bakın . Yine de geliştirme sürümünde değişecek bir not var, bağlandığımın üstündeki paragrafa bakın.
ralokt

@tkolar, burada tam olarak yanıltıcı olan nedir? eğer kullanıcının bir profili yoksa ve siz get_profile.something'i çağırıyorsanız hataya neden olur.
Sergey Golovchenko

4

Django> 1.5 kullanıyorsanız artık kullanamazsınız get_profile.

Eski bir uygulamanız varsa, uygulamanızdan kaldırmalısınız AUTH_PROFILE_MODULE = 'myapp.profile'.settings.py .

Eğer kullanırsanız models.OneToOneField(User), Profil sınıfında, sadece kullanabilirsiniz

{{ request.user.profile.whatever }}

Django şablonunuzda


1
@AlexStewart Yani artık requestöndeki klavyeye ihtiyacımız yok mu?
Luk Aron

3

Herhangi birine yardımcı oluyorsa, şablonumda aşağıdakileri kullandım:

Kullanıcı adı: {{ user.username }}

Kullanıcı Tam adı: {{ user.get_full_name }}

Kullanıcı grubu: {{ user.groups.all.0 }}

E-posta: {{ user.email }}

Oturum Başladı: {{ user.last_login }}

Örnek bir sonuç şuna benzer:

Kullanıcı: denetçi ezio

Kullanıcı Grubu: denetimGrubu

Kullanıcı adı: testUser03

E-posta: testuser03@auditor.com

Oturum Başladı - 16 Nisan 2018, 21:38

Teşekkürler :)


1

Çalışma !

Profil modelinizde related_name sağlayın

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

Daha sonra şablon kullanımında. Burada şirket_adı profil tablosundaki alandır

{{ request.user.user_profile.company_name }}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.