ตรวจสอบสิทธิ์ภายในเทมเพลตใน Django


95

ฉันสามารถใช้การอนุญาตของแอปพลิเคชัน Auth เพื่อตรวจสอบเทมเพลตใน Django ได้หรือไม่ (ฉันต้องการแสดงแบบฟอร์มง่ายๆที่ส่วนท้ายของเทมเพลตสำหรับผู้ใช้ที่มีสิทธิพิเศษ)

และที่สำคัญฉันควรทำเลยหรือนี่ไม่ใช่ "Django way"?


สำหรับคนอย่างฉันที่สะดุดกับสิ่งนี้ในภายหลังลิงค์สำหรับ Django 1.5 ก็เปลี่ยนไปเล็กน้อย ตอนนี้ข้อมูลสามารถพบได้ในเอกสารที่ url นี้: docs.djangoproject.com/en/1.5/topics/auth/default/#permissionsไม่มีอะไรในคำตอบเดิมเปลี่ยนไป แต่นี่เป็นเพียง url ใหม่ :)
Xudonax

คำตอบ:


192

หากคุณต้องการตรวจสอบสิทธิ์ในแม่แบบรหัสต่อไปนี้จะเพียงพอ:

{% if perms.app_label.can_do_something %}
<form here>
{% endif %}

โดย model หมายถึงโมเดลที่ผู้ใช้ต้องการสิทธิ์เพื่อดูแบบฟอร์ม

อ้างอิงhttps://docs.djangoproject.com/en/stable/topics/auth/default/#permissionsสำหรับตัวอย่างเพิ่มเติม

สิทธิ์ของผู้ใช้ที่ล็อกอินในปัจจุบันจะถูกเก็บไว้ในตัวแปรเทมเพลต {{ perms }}

(ซึ่งต้องใช้หน่วยประมวลผลบริบทต่อไปนี้จะได้รับการเปิดใช้งาน: django.contrib.auth.context_processors.auth)


15
โปรดทราบว่าหากคุณลงชื่อเข้าใช้เป็น superuser perms.app_label.foobarจะเป็นจริงเสมอแม้ว่าคุณจะสะกดชื่อสิทธิ์ผิด
Flimm

2
โปรดทราบว่า "can_do_something" เป็นชื่อของการอนุญาตดังนั้นคุณไม่จำเป็นต้องใส่คำนำหน้า "can" ในชื่อสิทธิ์ เช่น perms.my_app.add_object
Karim Sonbol

13

ทดสอบกับ Django 2.0 +

หากคุณต้องการดูสิทธิ์ทั้งหมดที่ผู้ใช้ล็อกอินมีบนเทมเพลตของคุณ (.html) ให้พิมพ์:

{{ perms.app_name }}

หรือ

{{ perms }}

ในการตรวจสอบว่าผู้ใช้มีสิทธิ์หรือไม่ให้ใช้:

{% if perms.app_name.change_model_name_lower_cased %}

เช่น :

{% if perms.Utilization.change_invoice %}

ที่นี่: การใช้งานคือชื่อแอปของฉัน ใบแจ้งหนี้เป็นชื่อรุ่น

โปรดทราบว่าโดยทั่วไปจะมีการอนุญาต 4 ประเภท:

  • เปลี่ยน [เช่น Utilization.change_projectemail]
  • ดู [เช่น Utilization.view_invoice]
  • ลบ [เช่น Utilization.delete_invoicetype]
  • เพิ่ม [เช่น Utilization.add_invoicetype]

นอกจากนี้หากคุณต้องการดูการอนุญาตทั้งหมดที่ผู้ใช้มีเนื่องจากกลุ่มที่เขาเป็นสมาชิกให้เปิด Django shell ...

user = User.objects.get(username='somename')
user.get_group_permissions()

ที่นี่การอนุญาตทั้งหมดที่อยู่ในรายการเป็นเพราะกลุ่มที่เขาอยู่


1
ใช่. จริงๆ: lowercased ไม่ใช่ snake_cased แนวคิดในการดูสิทธิ์ด้วย {{perms}} นั้นดีมากดังนั้นฉันคิดว่านี่คือคำตอบที่ดีที่สุด
mirek

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