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.