Sprawdź uprawnienia w szablonie w Django

90

Czy mogę użyć sprawdzania uprawnień aplikacji Auth wewnątrz szablonu w Django? (Chcę wyświetlić prosty formularz na końcu szablonu dla uprzywilejowanych użytkowników)

A co ważniejsze, czy powinienem to w ogóle zrobić, czy nie jest to „droga Django”?

Daniel
źródło
Dla ludzi takich jak ja, którzy natkną się na to później, link do Django 1.5 został nieco zmieniony. Informacje można teraz znaleźć w dokumentach pod tym adresem URL: docs.djangoproject.com/en/1.5/topics/auth/default/#permissions Nic w oryginalnej odpowiedzi tak naprawdę się nie zmieniło, ale to tylko nowy adres URL :)
Xudonax

Odpowiedzi:

187

Jeśli chcesz sprawdzić uprawnienia w szablonach, wystarczy następujący kod:

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

Gdzie model odnosi się do modelu, do którego użytkownik potrzebuje uprawnień, aby wyświetlić formularz.

Więcej przykładów znajdziesz na https://docs.djangoproject.com/en/stable/topics/auth/default/#permissions .

Uprawnienia aktualnie zalogowanego użytkownika są przechowywane w zmiennej szablonu {{ perms }}

(To wymaga następujących procesor kontekście jest włączona: django.contrib.auth.context_processors.auth)

Victor Neo
źródło
14
Pamiętaj, że jeśli jesteś zalogowany jako superużytkownik, perms.app_label.foobarzawsze będzie prawdziwe, nawet jeśli błędnie wpisałeś nazwę uprawnienia.
Flimm
2
Zauważ również, że „can_do_something” jest nazwą uprawnienia, więc nie musisz dodawać przedrostka „can” do nazwy uprawnienia. Np. Perms.my_app.add_object
Karim Sonbol,
11

Testowane na Django 2.0 +

Jeśli chcesz zobaczyć wszystkie uprawnienia, jakie posiada zalogowany użytkownik, w swoim szablonie (.html), wydrukuj:

{{ perms.app_name }}

Lub

{{ perms }}

Aby sprawdzić, czy użytkownik ma uprawnienia, użyj:

{% if perms.app_name.change_model_name_lower_cased %}

Np .:

{% if perms.Utilization.change_invoice %}

Tutaj: Wykorzystanie to nazwa mojej aplikacji. Faktura to nazwa modelu.

Pamiętaj, że ogólnie będą dostępne 4 rodzaje uprawnień:

  • change [np. Utilization.change_projectemail]
  • wyświetl [np. Utilization.view_invoice]
  • usuń [np. Utilization.delete_invoicetype]
  • dodaj [np. Utilization.add_invoicetype]

Ponadto, jeśli chcesz zobaczyć wszystkie uprawnienia, które ma użytkownik ze względu na grupy, do których należy, uruchom powłokę Django ...

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

Tutaj wszystkie wymienione uprawnienia są związane z grupami, do których należy.

Arindam Roychowdhury
źródło
1
Tak. Naprawdę: małymi literami. Nie dotyczy węża. Pomysł, aby zobaczyć uprawnienia z {{perms}} jest świetny, więc myślę, że to najlepsza odpowiedź.
mirek
0

przepraszam, że 'odkopałem' ten post, ale mam problem związany z uprawnieniami, zobacz mój post: Django: logika nie jest dobrze zastosowana w szablonie przy użyciu uprawnień (perm

Ponieważ Arindam wydaje się być bardzo zadowolony z tej koncepcji, mam nadzieję, że on lub inny mógłby mi pomóc

uprawnienia nie są stosowane, nawet jeśli wartość jest poprawna, gdy szukam {{perms}} w moim szablonie, zwraca obiekt, ale nie listę uprawnień, jeśli szukam {{perms.randomization.can_randomize}} zwraca False (lub True ) to jest dobra wartość moja aplikacja nazywa się randomization i definiuję uprawnienie can_randomize w modelach randomizacji (przy użyciu meta), które są częścią mojej aplikacji do randomizacji

Sprawdzam settings.py, ale wszystkie szwy są w porządku

ŁUPKARZ
źródło
Cześć Slater. Widziałem to właśnie dzisiaj. Jest oczywiście za późno. Ale jeśli chcesz polecić kogoś, aby otrzymał wiadomość, dodaj @Name do wiadomości w tej sekcji komentarzy.
Arindam Roychowdhury