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?

Swaroop CH
sumber

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.

AdamKG
sumber
3
Lihat docs.djangoproject.com/en/dev/topics/templates/#variables Aturannya sangat keren.
S. Lotot
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}}.

Rachel
sumber
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.

Sergey Golovchenko
sumber
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

Sascha Rau
sumber
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: [email protected]

Sesi Dimulai pada- 16 April 2018, 21:38

Terima kasih :)

Mohammad
sumber
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 }}
Nids Barthwal
sumber