Überprüfen Sie die Berechtigung in einer Vorlage in Django

89

Kann ich die Berechtigungsprüfung der Auth-Anwendung in einer Vorlage in Django verwenden? (Ich möchte ein einfaches Formular am Ende der Vorlage für privilegierte Benutzer anzeigen.)

Und was noch wichtiger ist, sollte ich es überhaupt tun oder ist dies nicht der "Django-Weg"?

Daniel
quelle
Für Leute wie mich, die später darauf stoßen, wurde der Link für Django 1.5 leicht geändert. Die Informationen finden Sie jetzt in den Dokumenten unter dieser URL: docs.djangoproject.com/de/1.5/topics/auth/default/#permissions Die ursprüngliche Antwort hat sich nicht wirklich geändert, aber dies ist nur eine neue URL :)
Xudonax

Antworten:

186

Wenn Sie nach Berechtigungen in Vorlagen suchen möchten, reicht der folgende Code aus:

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

Dabei bezieht sich Modell auf das Modell, für das der Benutzer Berechtigungen benötigt, um das Formular anzuzeigen.

Weitere Beispiele finden Sie unter https://docs.djangoproject.com/de/stable/topics/auth/default/#permissions .

Die Berechtigungen des aktuell angemeldeten Benutzers werden in der Vorlagenvariablen gespeichert {{ perms }}

(Dies erfordert den folgenden Kontext Prozessor aktiviert werden: django.contrib.auth.context_processors.auth)

Victor Neo
quelle
14
Beachten Sie, dass, wenn Sie als Superuser angemeldet sind, dies perms.app_label.foobarimmer der Fall ist, auch wenn Sie den Berechtigungsnamen falsch geschrieben haben.
Flimm
2
Beachten Sie hier auch, dass "can_do_something" der Name der Berechtigung ist, sodass Sie dem Berechtigungsnamen kein Präfix "can" hinzufügen müssen. ZB perms.my_app.add_object
Karim Sonbol
11

Getestet auf Django 2.0 +

Wenn Sie alle Berechtigungen des angemeldeten Benutzers in Ihrer Vorlage (.html) anzeigen möchten, drucken Sie:

{{ perms.app_name }}

Oder

{{ perms }}

Um zu überprüfen, ob der Benutzer über die Berechtigung verfügt, verwenden Sie:

{% if perms.app_name.change_model_name_lower_cased %}

Z.B :

{% if perms.Utilization.change_invoice %}

Hier: Nutzung ist mein App-Name. Rechnung ist ein Modellname.

Beachten Sie, dass es im Allgemeinen vier Arten von Berechtigungen gibt:

  • change [zB Utilization.change_projectemail]
  • view [zB Utilization.view_invoice]
  • löschen [zB Utilization.delete_invoicetype]
  • add [zB Utilization.add_invoicetype]

Wenn Sie alle Berechtigungen anzeigen möchten, die ein Benutzer aufgrund der Gruppen hat, denen er angehört, starten Sie die Django-Shell ...

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

Hier sind alle aufgeführten Berechtigungen auf die Gruppen zurückzuführen, zu denen er gehört.

Arindam Roychowdhury
quelle
1
Ja. Wirklich: Kleinbuchstaben. Nicht snake_cased. Die Idee, Berechtigungen mit {{perms}} anzuzeigen, ist großartig, daher denke ich, dass dies die beste Antwort ist.
Mirek
0

Es tut mir leid, diesen Beitrag "ausgegraben" zu haben, aber ich habe ein Problem mit Berechtigungen. Siehe meinen Beitrag: Django: Logik in Vorlage mit Berechtigungen nicht gut angewendet (Dauerwelle)

Da Arindam sich mit diesem Konzept sehr wohl fühlt, hoffe ich, dass er oder andere mir helfen können

Perms gelten nicht, auch wenn der Wert korrekt ist, wenn ich in meiner Vorlage nach {{perms}} suche. Es wird ein Objekt zurückgegeben, aber nicht die Liste der Berechtigungen, wenn ich nach {{perms.randomization.can_randomize}} suche. Es wird False (oder True zurückgegeben ) das ist der gute Wert, den meine App als Randomisierung bezeichnet, und ich definiere die Berechtigung can_randomize in Randomisierungsmodellen (unter Verwendung von Meta), die Teil meiner Randomisierungs-App sind

Ich überprüfe settings.py, aber alle Nähte sind in Ordnung

DACHDECKER
quelle
Hallo Slater. Ich habe das erst heute gesehen. Es ist offensichtlich zu spät. Wenn Sie jedoch jemanden verweisen möchten, damit er die Nachricht erhält, fügen Sie der Nachricht in diesem Kommentarbereich einen @Name hinzu.
Arindam Roychowdhury