sagen, dass ich eine Ansicht, die mit dem user_passes_test
Dekorateur eingerichtet wurde: es zu einer URL bisIn Django Vorlage: Überprüfen Sie, ob die Benutzerberechtigung Ansicht nach Name angegeben zuzugreifen
# myapp/views.py
from django.views.generic import TemplateView
from django.contrib.auth.decorators import user_passes_test
def has_perm1_or_perm2(user):
return user.has_perm('myapp.perm1') or user.has_perm('myapp.perm2')
@user_passes_test(has_perm1_or_perm2)
class MyView(TemplateView):
# my view code goes here
und ich Haken wie folgt:
# myapp/urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
...,
url(r'^myview$', views.MyView.as_view(), name='myview'),
...
]
Wenn ich einen Link zu dieser Ansicht in einer Vorlage setzen will, würde es ungefähr so aussehen:
<a href="{% url 'myapp:myview' %}">Check out my view!</a>
Aber ich möchte in der Lage sein, einige Kontrolle in die Vorlage zu setzen, so dass das oben genannte nur angezeigt wird, wenn der aktuell angemeldete Benutzer von der für die Ansicht angegebenen Funktion user_passes_test
genehmigt werden würde.
I.e. Ich möchte meine Vorlage wie folgt aussehen lassen:
{% if check_user_has_view_permission request.user 'myapp:myview' %}
<a href="{% url 'myapp:myview' %}">Check out my view!</a>
{% else %}
Nothing to see here...
{% endif %}
Wie kann ich das erreichen?
Danke!
Beachten Sie, dass der 'user_passes_test'-Dekorator für prozedurale Ansichten vorgesehen ist. Für klassenbasierte Ansichten müssen Sie [a mixin] (https://docs.djangoproject.com/en/1.9/topics/auth/default/#django.contrib.auth.mixins.UserPassesTestMixin) verwenden. – solarissmoke
Vielen Dank, dass Sie sich die Zeit genommen haben, einen Kommentar abzugeben. Ich hatte gedacht, dass es in der Vergangenheit möglich war, klassenbasierte Ansichten zu dekorieren. Ist das eine neue Sache in 1.9, dass Sie Mixins für CBVs verwenden müssen? Oder ist es nur Erlaubnis bezogene Dekorateure auf CBV? Oder ist das nur zu empfehlen, aber der Decorator-Ansatz funktioniert noch? – 8one6
Decorators funktionieren nicht AFAIK. Vor Django 1.9 musste man eigene Mixins schreiben oder die "Dispatch" -Methode der Ansicht dekorieren. – solarissmoke