Mam trochę problemów ze zrozumieniem, jak działają nowe CBV. Moje pytanie jest takie, muszę wymagać logowania we wszystkich widokach, aw niektórych z nich, określonych uprawnień. W widokach opartych na funkcjach robię to z @permission_required () i atrybutem login_required w widoku, ale nie wiem, jak to zrobić w nowych widokach. Czy jest jakaś sekcja w dokumentacji django wyjaśniająca to? Nic nie znalazłem. Co jest nie tak w moim kodzie?
Próbowałem użyć @method_decorator, ale odpowiada: „ TypeError w /space / prueba / _wrapped_view () przyjmuje co najmniej 1 argument (podano 0) ”
Oto kod (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
źródło
message
?Oto moje podejście, tworzę chroniony mixin (jest to przechowywany w mojej bibliotece):
Zawsze, gdy chcesz, aby widok był chroniony, po prostu dodaj odpowiednią mieszankę:
Tylko upewnij się, że Twój miks jest pierwszy.
Aktualizacja: opublikowałem to już w 2011 roku, począwszy od wersji 1.9 Django zawiera teraz ten i inne przydatne miksy (AccessMixin, PermissionRequiredMixin, UserPassesTestMixin) w standardzie!
źródło
Oto alternatywa korzystania z dekoratorów opartych na klasach:
Można to następnie użyć po prostu w ten sposób:
źródło
class_view_decorator(my_decorator(*args, **kwargs))
. Jeśli chodzi o warunkowe dopasowywanie metod - możesz zmodyfikować class_view_decorator, aby zastosować się doView.get
lubView.post
zamiastView.dispatch
.Zdaję sobie sprawę, że ten wątek jest trochę przestarzały, ale i tak oto moje dwa centy.
z następującym kodem:
mamy teraz sposób na łatanie dekoratora, aby stał się wielofunkcyjny. W praktyce oznacza to, że po zastosowaniu do zwykłego dekoratora widoku, na przykład:
ten dekorator będzie nadal działał, gdy będzie używany zgodnie z pierwotnym przeznaczeniem:
ale będzie również działać poprawnie, gdy jest używany w taki sposób:
Wydaje się, że działa to dobrze w kilku przypadkach, z którymi ostatnio się spotkałem, w tym na tym przykładzie z prawdziwego świata:
Funkcja Ajax_view została napisana w celu zmodyfikowania widoku (opartego na funkcji), tak aby wywoływał błąd 404 za każdym razem, gdy ten widok jest odwiedzany przez wywołanie inne niż ajax. Po prostu stosując funkcję łatki jako dekorator, ten dekorator jest gotowy do pracy również w widokach opartych na klasach
źródło
Dla tych z Was, którzy używają Django> = 1,9 , to już uwzględnione w
django.contrib.auth.mixins
jakAccessMixin
,LoginRequiredMixin
,PermissionRequiredMixin
iUserPassesTestMixin
.Aby zastosować LoginRequired do CBV (np.
DetailView
):Warto również pamiętać o kolejności GCBV Mixin: Mixiny muszą znajdować się po lewej stronie, a klasa widoku bazowego musi znajdować się po prawej stronie. Jeśli kolejność jest inna, możesz uzyskać zepsute i nieprzewidywalne wyniki.
źródło
Użyj nawiasów klamrowych Django. Zapewnia wiele użytecznych, łatwo dostępnych miksów. Ma piękne dokumenty. Wypróbuj to.
Możesz nawet tworzyć własne składanki.
http://django-braces.readthedocs.org/en/v1.4.0/
Przykładowy kod:
źródło
Jeśli jest to witryna, w której większość stron wymaga zalogowania się użytkownika, możesz użyć oprogramowania pośredniego, aby wymusić logowanie we wszystkich widokach, z wyjątkiem tych, które są specjalnie oznaczone.
Oprogramowanie pośrednie w wersji Pre Django 1.10.py:
views.py:
Wyświetlenia stron trzecich, których nie chcesz zawijać, można wyłączyć w ustawieniach:
settings.py:
źródło
W moim kodzie napisałem ten adapter, aby dostosować funkcje składowe do funkcji niebędącej składową:
Możesz go po prostu użyć w ten sposób:
źródło
method_decorator
jest). Wydaje się, że jest to miły i czytelny sposób na osiągnięcie tego.Jest to bardzo łatwe z django> 1.9, które obsługuje
PermissionRequiredMixin
iLoginRequiredMixin
Po prostu zaimportuj z pliku auth
views.py
Aby uzyskać więcej informacji, przeczytaj Autoryzacja w django
źródło
Minęło trochę czasu, a teraz Django bardzo się zmieniło.
Sprawdź tutaj, jak ozdobić widok oparty na klasach.
https://docs.djangoproject.com/en/2.2/topics/class-based-views/intro/#decorating-the-class
Dokumentacja nie zawierała przykładu „dekoratorów, którzy przyjmują jakikolwiek argument”. Ale dekoratorzy, którzy przyjmują argumenty, wyglądają następująco:
więc jeśli mamy używać mydec jako „normalnego” dekoratora bez argumentów, możemy to zrobić:
Więc podobnie, aby użyć
permission_required
zmethod_decorator
możemy zrobić:
źródło
Jeśli robisz projekt, który wymaga różnych testów uprawnień, możesz dziedziczyć tę klasę.
źródło
Zrobiłem tę poprawkę w oparciu o rozwiązanie Josha
Przykładowe użycie:
źródło
Tutaj rozwiązanie dla Permissions_required decorator:
źródło