จะเข้าถึงโปรไฟล์ผู้ใช้ในเทมเพลต Django ได้อย่างไร?


89

ฉันกำลังจัดเก็บข้อมูลเพิ่มเติมต่อผู้ใช้โดยใช้ไฟล์AUTH_PROFILE_MODULE.

เราสามารถเข้าถึงผู้ใช้ในเทมเพลต Django โดยใช้{{ request.user }}แต่เราจะเข้าถึงฟิลด์ในโปรไฟล์ได้อย่างไรเนื่องจากโปรไฟล์สามารถเข้าถึงได้ผ่านฟังก์ชันuser.get_profile()เท่านั้น

จำเป็นต้องส่งโปรไฟล์ลงในเทมเพลตทุกครั้งอย่างชัดเจนหรือไม่?

คำตอบ:


136

ใช้{{ request.user.get_profile.whatever }}. ภาษาเทมเพลตของ Django จะเรียกสิ่งที่เรียกได้โดยอัตโนมัติ - ในกรณีนี้คือ.get_profile()วิธีการ



3
สิ่งนี้เลิกใช้แล้วใน Django 1.5 ขึ้นไปและไม่ทำงานใน Django 1.7 ขึ้นไป ดูคำตอบของ Sacha Rau สำหรับวิธีการทำใน Django สมัยใหม่
MichielB

27

ไม่แน่ใจว่าเหตุใดจึงแตกต่างกันสำหรับฉัน แต่ฉันต้องใช้ {{user}} แทน {{request.user}}


5
เอกสารระบุว่า ( docs.djangoproject.com/en/dev/topics/auth/… ) ว่าคุณสามารถเข้าถึงผู้ใช้ได้ง่ายๆโดย {{user}} ตามที่คุณพูด
Xiong Chiamiov

2
เหตุผลที่แท้จริงในการใช้ {{user}} และไม่ใช่ {{request.user}} เนื่องจากคุณไม่ได้รวมตัวประมวลผลบริบทเทมเพลตสำหรับการร้องขอ https://docs.djangoproject.com/en/dev/ref/templates/api/#django-core-context-processors-request
knightZeRo

4
ลิงค์แตกต่างกันเล็กน้อยสำหรับ Django 1.10 แต่ความคิดเหมือนกันคือdjango.template.context_processors.requestแทรกrequestเทมเพลตในขณะที่ส่วนdjango.contrib.auth.context_processors.authแทรกuserในบริบท docs.djangoproject.com/th/1.10/ref/templates/api/…
Andrei-Niculae Petre

8

ใช่เป็นไปได้ที่จะเข้าถึงโปรไฟล์จากเทมเพลตโดยใช้ request.user.get_profile

อย่างไรก็ตามมีข้อแม้เล็กน้อย: ไม่ใช่ผู้ใช้ทุกคนที่จะมีโปรไฟล์ซึ่งในกรณีของฉันกับผู้ดูแลระบบ ดังนั้นการโทรโดยตรง {{ request.user.get_profile.whatever }}จากเทมเพลตจะทำให้เกิดข้อผิดพลาดในกรณีดังกล่าว

หากคุณแน่ใจว่าผู้ใช้ของคุณทุกคนมีโปรไฟล์อยู่เสมอคุณสามารถโทรจากเทมเพลตได้อย่างปลอดภัยไม่เช่นนั้นให้โทรget_profile()จากภายใน try-except block ในมุมมองของคุณและส่งต่อไปยังเทมเพลต


คำตอบนี้ทำให้เข้าใจผิด - ฉันยังไม่ได้ทดสอบ{{ request.user.get_profile.whatever }}แต่{{ request.user.get_profile }}จะใช้งานได้และสามารถใช้เพื่อตรวจสอบว่ามีโปรไฟล์อยู่หรือไม่ในเวอร์ชันปัจจุบัน ดูdocs.djangoproject.com/en/dev/ref/templates/api/... มีข้อสังเกตว่าจะมีการเปลี่ยนแปลงในเวอร์ชันระหว่างการพัฒนา แต่โปรดดูย่อหน้าด้านบนที่ฉันลิงก์ไว้
ralokt

@tkolar อะไรคือสิ่งที่ทำให้เข้าใจผิดที่นี่? หากผู้ใช้ไม่มีโปรไฟล์และคุณกำลังเรียกใช้ get_profile.s สิ่งที่จะทำให้เกิดข้อผิดพลาด
Sergey Golovchenko

4

หากคุณกำลังใช้ Django> 1.5 get_profileคุณสามารถไม่ได้ใช้

หากคุณมีแอปเดิมคุณควรลบออกAUTH_PROFILE_MODULE = 'myapp.profile'จากsettings.pyไฟล์.

หากคุณใช้models.OneToOneField(User)ในคลาสโปรไฟล์ของคุณคุณสามารถใช้

{{ request.user.profile.whatever }}

ในเทมเพลต Django ของคุณ


1
@AlexStewart คุณหมายความว่าเราไม่จำเป็นต้องใช้requestแป้นพิมพ์ด้านหน้าอีกต่อไป?
ลูก

3

ถ้าจะช่วยใครฉันใช้สิ่งต่อไปนี้ในแม่แบบของฉัน:

ชื่อผู้ใช้: {{ user.username }}

ชื่อ - นามสกุลของผู้ใช้: {{ user.get_full_name }}

กลุ่มผู้ใช้: {{ user.groups.all.0 }}

อีเมล์: {{ user.email }}

เริ่มเซสชั่นที่: {{ user.last_login }}

ตัวอย่างผลลัพธ์เป็นดังนี้:

ผู้ใช้: ผู้ตรวจสอบบัญชี ezio

กลุ่มผู้ใช้: auditGroup

ชื่อผู้ใช้: testUser03

อีเมล: testuser03@auditor.com

เริ่มภาคการศึกษาวันที่ - 16 เมษายน 2561 เวลา 21:38 น

ขอบคุณ :)


1

ทำงาน!

ในรูปแบบโปรไฟล์ของคุณระบุ related_name

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

จากนั้นในการใช้เทมเพลต ที่นี่ company_name คือฟิลด์ในตารางโปรไฟล์

{{ request.user.user_profile.company_name }}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.