2016-07-08 5 views
1

Zum Beispiel, wenn ich nicht auf die "Register" Ansicht zugreifen möchte, wenn der Benutzer bereits angemeldet ist?Was ist das Gegenteil von LoginRequiredMixin, Wie verweigern Sie den Zugriff auf einen angemeldeten Benutzer?

Ich benutze diese an der Spitze jeder Ansicht, und es funktioniert gut:

def get(self, request, *args, **kwargs): 
     if request.user.is_authenticated(): 
      return HttpResponseRedirect('/') 
     return super(MyCBV_vw, self).get(request, *args, **kwargs) 

Aber vielleicht gibt es einen Dekorateur o mixin dafür, würde ich gerne wissen, ob es eine bessere Art und Weise zu tun, Dies? Vielen Dank!

Antwort

0

Ich verwende Klasse basierte Ansichten, so hatte ich ein mixin verwendet:

class NotLoggedAllow(UserPassesTestMixin): 
    login_url = '/profile/' 

    def test_func(self): 
     return not self.request.user.is_authenticated() 

class Register_vw(NotLoggedAllow, FormView): 

Auf diese Weise muss ich nur noch an jeder Ansicht den Namen meines mixin hinzufügen und den Zugriff bestreitet zu einem angemeldeten Benutzer. Nailed @Moses Koledoye, danke allen!

0

Sie können eine benutzerdefinierte erstellen 'LogoutRequiredMixin':

class LogoutRequiredMixin(View): 

    def dispatch(self, *args, **kwargs): 
     if request.user.is_authenticated(): 
      return HttpResponseRedirect('/') 
     return super(LogoutRequiredMixin, self).dispatch(*args, **kwargs) 

es dann in Ihre Ansichten verwenden:

class RegisterView(LogoutRequiredMixin): 

    def get(...): 
     ... 
+0

Das Mixin sollte in der gleichen Datei sein (views.py)? Sieht aus wie eine gute Idee. Aber ist das die Art, wie du diese Aufgabe machst? Mache ich etwas Seltenes? Ich dachte, dass "den Zugriff verweigern" sollte eine häufige Aufgabe – QUHO

+0

sein, dass Mixin kann wo immer Sie wollen in Ihrer App leben, müssen Sie nur importieren, ich sollte es auf diese Weise tun. – Gocht

3

Django hat eine user_passes_test Dekorateur, die ich denke, ist das, was Sie brauchen. Der Dekorator nimmt eine Funktion (mit anderen optionalen) als Argument.

können Sie diese Funktion schreiben alle angemeldet Nutzer, die diese Ansicht zuzugreifen versuchen:

from django.contrib.auth.decorators import user_passes_test 

def not_logged_in(user): 
    return not user.is_authenticated() 

@user_passes_test(not_logged_in) 
def my_view(request, *args, **kwargs): 
    # your code 

Denken Sie daran, eine method_decorator anzuwenden diesen Dekorateur Ihre get Methode zu verwenden.

+0

Ich sah es in der Dokumentation, aber es hat es nicht verstanden, ich werde es wieder langsamer lesen. Ich werde dich wissen lassen, danke! – QUHO

Verwandte Themen