Bagaimana mengakses profil pengguna dalam template Django?


89

Saya menyimpan beberapa informasi tambahan per pengguna menggunakan AUTH_PROFILE_MODULE.

Kita dapat mengakses pengguna dalam templat Django dengan menggunakan {{ request.user }}tetapi bagaimana kita mengakses bidang dalam profil karena profil hanya dapat diakses melalui fungsi user.get_profile()?

Apakah benar-benar diwajibkan untuk secara eksplisit meneruskan profil ke template setiap saat?

Jawaban:


136

Gunakan {{ request.user.get_profile.whatever }}. Bahasa templat Django secara otomatis memanggil hal-hal yang dapat dipanggil - dalam hal ini, .get_profile()metode.



3
Ini tidak digunakan lagi di Django 1.5 dan lebih tinggi dan tidak bekerja di Django 1.7 dan lebih tinggi. Lihat jawaban Sacha Rau tentang bagaimana melakukan ini di Django modern.
— MichielB

27

Tidak yakin mengapa ini berbeda untuk saya, tapi saya perlu menggunakan {{user}} daripada {{request.user}}.


5
Dokumen mengatakan ( docs.djangoproject.com/en/dev/topics/auth/… ) bahwa Anda dapat mengakses pengguna hanya dengan {{user}}, seperti yang Anda katakan.
— Xiong Chiamiov

2
Alasan sebenarnya untuk menggunakan {{user}} dan bukan {{request.user}} adalah karena Anda tidak menyertakan pemroses konteks template untuk permintaan. https://docs.djangoproject.com/en/dev/ref/templates/api/#django-core-context-processors-request
— knightZeRo

4
Tautan sedikit berbeda untuk Django 1.10, tetapi idenya sama, django.template.context_processors.requestmenyisipkan requestcetakan dalam, sedangkan django.contrib.auth.context_processors.authmenyisipkan userdalam konteks. docs.djangoproject.com/en/1.10/ref/templates/api/…
— Andrei-Niculae Petre

8

Ya, dimungkinkan untuk mengakses profil dari template menggunakan request.user.get_profile

Namun ada peringatan kecil : tidak semua pengguna akan memiliki profil, seperti yang saya alami dengan pengguna admin. Jadi memanggil langsung {{ request.user.get_profile.whatever }}dari template akan menyebabkan kesalahan dalam kasus seperti itu.

Jika Anda yakin semua pengguna Anda selalu memiliki profil, maka aman untuk menelepon dari template, jika tidak, panggil get_profile()dari dalam blok coba-kecuali dalam tampilan Anda dan teruskan ke template.


Jawaban ini menyesatkan - Saya belum menguji {{ request.user.get_profile.whatever }}, tetapi {{ request.user.get_profile }}akan berfungsi dan dapat digunakan untuk memeriksa apakah profil ada atau tidak dalam versi saat ini. Lihat docs.djangoproject.com/en/dev/ref/templates/api/… . Ada catatan yang akan berubah dalam versi pengembangan, meskipun, lihat paragraf di atas yang saya tautkan.
— ralokt

@tkolar, apa sebenarnya yang menyesatkan di sini? jika pengguna tidak memiliki profil dan Anda memanggil get_profile.something yang akan menyebabkan kesalahan.
— Sergey Golovchenko

4

Jika Anda menggunakan Django> 1.5 Anda tidak dapat lagi menggunakan get_profile.

Jika Anda memiliki aplikasi lawas, Anda harus menghapus AUTH_PROFILE_MODULE = 'myapp.profile'dari settings.py.

Jika Anda menggunakan models.OneToOneField(User)di kelas Profil Anda, Anda cukup menggunakan

{{ request.user.profile.whatever }}

dalam cetakan Django Anda


1
@AlexStewart maksud Anda kami tidak lagi membutuhkan requestkeyboard di depan?
— Luk Aron

3

Jika itu membantu siapa pun, saya menggunakan yang berikut ini di template saya:

Nama pengguna: {{ user.username }}

Nama lengkap pengguna: {{ user.get_full_name }}

Grup pengguna: {{ user.groups.all.0 }}

Surel: {{ user.email }}

Sesi Dimulai pada: {{ user.last_login }}

Hasil sampelnya seperti ini:

Pengguna: auditor ezio

Grup Pengguna: auditGroup

Nama pengguna: testUser03

Email: testuser03@auditor.com

Sesi Dimulai pada- 16 April 2018, 21:38

Terima kasih :)


1

Bekerja!

Dalam model profil Anda, berikan related_name

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

Kemudian di gunakan template. Berikut nama_perusahaan adalah bidang di tabel profil

{{ request.user.user_profile.company_name }}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.