Ich habe ein bisschen Probleme zu verstehen, wie die neuen CBVs funktionieren. Meine Frage lautet: Ich muss mich in allen Ansichten anmelden und in einigen von ihnen bestimmte Berechtigungen. In funktionsbasierten Ansichten mache ich das mit @permission_required () und dem Attribut login_required in der Ansicht, aber ich weiß nicht, wie ich das in den neuen Ansichten machen soll. Gibt es einen Abschnitt in den Django-Dokumenten, der dies erklärt? Ich habe nichts gefunden Was ist falsch in meinem Code?
Ich habe versucht, den @ method_decorator zu verwenden, aber er antwortet: " TypeError at / space / prueba / _wrapped_view () benötigt mindestens 1 Argument (0 angegeben) ".
Hier ist der Code (GPL):
from django.utils.decorators import method_decorator
from django.contrib.auth.decorators import login_required, permission_required
class ViewSpaceIndex(DetailView):
"""
Show the index page of a space. Get various extra contexts to get the
information for that space.
The get_object method searches in the user 'spaces' field if the current
space is allowed, if not, he is redirected to a 'nor allowed' page.
"""
context_object_name = 'get_place'
template_name = 'spaces/space_index.html'
@method_decorator(login_required)
def get_object(self):
space_name = self.kwargs['space_name']
for i in self.request.user.profile.spaces.all():
if i.url == space_name:
return get_object_or_404(Space, url = space_name)
self.template_name = 'not_allowed.html'
return get_object_or_404(Space, url = space_name)
# Get extra context data
def get_context_data(self, **kwargs):
context = super(ViewSpaceIndex, self).get_context_data(**kwargs)
place = get_object_or_404(Space, url=self.kwargs['space_name'])
context['entities'] = Entity.objects.filter(space=place.id)
context['documents'] = Document.objects.filter(space=place.id)
context['proposals'] = Proposal.objects.filter(space=place.id).order_by('-pub_date')
context['publication'] = Post.objects.filter(post_space=place.id).order_by('-post_pubdate')
return context
quelle
message
um es?Hier ist mein Ansatz: Ich erstelle ein Mixin, das geschützt ist (dies wird in meiner Mixin-Bibliothek gespeichert):
Wann immer Sie möchten, dass eine Ansicht geschützt wird, fügen Sie einfach das entsprechende Mixin hinzu:
Stellen Sie einfach sicher, dass Ihr Mixin an erster Stelle steht.
Update: Ich habe dies bereits 2011 veröffentlicht, beginnend mit Version 1.9. Django enthält jetzt dieses und andere nützliche Mixins (AccessMixin, PermissionRequiredMixin, UserPassesTestMixin) als Standard!
quelle
Hier ist eine Alternative mit klassenbasierten Dekorateuren:
Dies kann dann einfach so verwendet werden:
quelle
class_view_decorator(my_decorator(*args, **kwargs))
. Was den bedingten Methodenabgleich betrifft, können Sie den class_view_decorator so ändern, dass er sich aufView.get
oderView.post
anstelle von anwendetView.dispatch
.Mir ist klar, dass dieser Thread etwas veraltet ist, aber hier sind trotzdem meine zwei Cent.
mit folgendem Code:
Wir haben jetzt die Möglichkeit, einen Dekorateur zu patchen, damit er multifunktional wird. Dies bedeutet effektiv, dass bei Anwendung auf einen normalen Ansichtsdekorateur wie folgt:
Dieser Dekorateur funktioniert weiterhin, wenn er wie ursprünglich vorgesehen verwendet wird:
funktioniert aber auch richtig, wenn es so verwendet wird:
Dies scheint in einigen Fällen, auf die ich kürzlich gestoßen bin, gut zu funktionieren, einschließlich dieses realen Beispiels:
Die Funktion ajax_view wurde geschrieben, um eine (funktionsbasierte) Ansicht so zu ändern, dass sie einen 404-Fehler auslöst, wenn diese Ansicht von einem Nicht-Ajax-Aufruf aufgerufen wird. Durch einfaches Anwenden der Patch-Funktion als Dekorateur kann dieser Dekorateur auch in klassenbasierten Ansichten verwendet werden
quelle
Für diejenigen , die verwenden Django> = 1,9 , ist es bereits in enthalten
django.contrib.auth.mixins
wieAccessMixin
,LoginRequiredMixin
,PermissionRequiredMixin
undUserPassesTestMixin
.So wenden Sie LoginRequired auf CBV an (z. B.
DetailView
):Beachten Sie auch die GCBV-Mixin-Reihenfolge: Mixins müssen auf der linken Seite und die Basisansichtsklasse auf der rechten Seite angezeigt werden . Wenn die Reihenfolge anders ist, können fehlerhafte und unvorhersehbare Ergebnisse erzielt werden.
quelle
Verwenden Sie Django-Zahnspangen. Es bietet viele nützliche Mixins, die leicht verfügbar sind. Es hat schöne Dokumente. Versuch es.
Sie können sogar Ihre benutzerdefinierten Mixins erstellen.
http://django-braces.readthedocs.org/en/v1.4.0/
Beispielcode:
quelle
Wenn es sich um eine Site handelt, auf der für die meisten Seiten der Benutzer angemeldet sein muss, können Sie eine Middleware verwenden, um die Anmeldung für alle Ansichten zu erzwingen Ausnahme einiger besonders markierter .
Pre Django 1.10 middleware.py:
views.py:
Ansichten von Drittanbietern, die Sie nicht umbrechen möchten, können in den folgenden Einstellungen ausgeschlossen werden:
settings.py:
quelle
In meinem Code habe ich diesen Adapter geschrieben, um Elementfunktionen an eine Nichtmitgliedsfunktion anzupassen:
Sie können es einfach so verwenden:
quelle
method_decorator
ist). Es scheint eine gute und lesbare Möglichkeit zu sein, dies zu erreichen.Dies ist super einfach, da Django> 1.9 mit Unterstützung für
PermissionRequiredMixin
und geliefert wirdLoginRequiredMixin
Einfach aus der Authentifizierung importieren
views.py
Weitere Informationen finden Sie unter Autorisierung in Django
quelle
Es ist schon eine Weile her und jetzt hat sich Django so sehr verändert.
Hier erfahren Sie, wie Sie eine klassenbasierte Ansicht dekorieren.
https://docs.djangoproject.com/de/2.2/topics/class-based-views/intro/#decorating-the-class
Die Dokumentation enthielt kein Beispiel für "Dekorateure, die irgendwelche Argumente annehmen". Aber Dekorateure, die Argumente annehmen, sind wie folgt:
Wenn wir also mydec als "normalen" Dekorateur ohne Argumente verwenden wollen, können wir dies tun:
Also ähnlich zu verwenden
permission_required
mitmethod_decorator
wir können tun:
quelle
Wenn Sie ein Projekt ausführen, für das verschiedene Berechtigungstests erforderlich sind, können Sie diese Klasse erben.
quelle
Ich habe dieses Update basierend auf Joshs Lösung vorgenommen
Beispielnutzung:
quelle
Hier die Lösung für den erlaubten Dekorateur:
quelle