2016-08-13 1 views
0

Dies wird eine einfache Frage für jemanden da draußen sein. Ich habe ziemlich viel gesucht und wenn es einen Thread gibt, der das perfekt anspricht, bitte leite mich und mach das aus. Ich erstelle ein sehr einfaches Webformular auf der Website unserer Organisation mit Django.Wie übergibt man einen Benutzernamen von einem Django-Login-Formular?

In forms.py Ich habe eine Klasse für die Login-Seite bekommen:

class userLogin(forms.Form): 

    user = forms.CharField(label = 'Username ', max_length = 25) 
    pwd = forms.CharField(label = 'Password ', widget = forms.PasswordInput) 

    def clean(self): 

     cleaned_data = super(userLogin, self).clean() 
     user   = cleaned_data.get("user") 
     pwd   = cleaned_data.get("pwd") 

     if not fs.authenticateUser(user, pwd): 
      raise forms.ValidationError("Invalid password!") 

Ich habe unsere Website API zur Authentifizierung gegenüber, das ist es, was die fs.authenticate Bit ist über; Es gibt nur Wahr oder Falsch zurück. In views.py ich dies tun:

if request.method == 'POST': 

     user_form = userLogin(data = request.POST) 

     if user_form.is_valid():    
      return redirect('PickupAuthorization/main') 
     else: 
      pass      

Die Authentifizierung und Umleitung auf die Haupt-Seite funktioniert hervorragend, und das Anmeldeformular wirft ein ungültiges Kennwort Nachricht wie erwartet, wenn die Anmeldeinformationen nicht korrekt ist. Was ich wissen möchte ist, wie man "user" für views.py verfügbar macht. Wenn ich versuche, in der Ansicht auf user_form.user zu verweisen, sagt Python, dass dieser Benutzer kein Attribut von userLogin ist!

Ich habe nicht viel mit OOP gemacht, also stelle ich mir vor, dass dies eine einfache Antwort hat, aber ich kann es nicht verdammt finden. Vielen Dank!

EDIT: Ich musste dieses Projekt im Moment zugunsten dringender Angelegenheiten zurückstellen, aber ich werde es aktualisieren, wenn ich eine Lösung habe, die richtig funktioniert.

+3

Sie müssen das Rad nicht neu erfinden, werfen Sie einen Blick auf https://docs.djangoproject.com/de/1.10/topics/auth/customizing/ – Wtower

+0

Ich schaute mir das an und ich verstehe es wo es über die Einstellung AUTHENTICATION_BACKENDS spricht. Aber dann diskutiert er das Schreiben meines eigenen Authentifizierungs-Backends, was ich tun muss, weil ich eine API eines Drittanbieters verwende. Es ist mir jedoch unklar, wie ein Benutzerobjekt zurückgegeben wird. Wenn ich die Dokumentation unter https://docs.djangoproject.com/en/1.10/topics/auth/default/#user-objects richtig lese, müsste ich etwas wie 'von django.contrib.auth machen. Modelle importieren User' und dann 'user = User.objects.create_user' - mit dem authentifizierten Benutzernamen, ja? –

Antwort

1

Sie müssen authenticate Methode von Django bereitgestellt, um den Benutzer zu erhalten. Die Methode authenticate gibt einen Benutzer zurück, wenn dieser gefunden wird.
Zu authenticate eine gegebene username und password, verwenden Sie authenticate(). Es benötigt zwei Schlüsselwortargumente, username und password, und es gibt User object zurück, wenn password für das angegebene username gültig ist. Wenn die password ungültig ist, authenticate() kehrt None:

Im Allgemeinen wird die Strömung mit authenticate geht so:

forms.py

class userLogin(forms.Form): 

    user = forms.CharField(label = 'Username ', max_length = 25) 
    pwd = forms.CharField(label = 'Password ', widget = forms.PasswordInput) 

    def __init__(self, *args, **kwargs): 
     self.user_cache = None # You need to make the user as None initially 
     super(LoginForm, self).__init__(*args, **kwargs) 

    def clean(self): 

     cleaned_data = super(userLogin, self).clean() 
     user   = cleaned_data.get("user") 
     pwd   = cleaned_data.get("pwd") 

     # Now you get the user 
     self.user_cache = authenticate(username=user, password=pwd) 
     # Do other stuff 
     return self.cleaned_data 

    # Function to return user in views 
    def get_user(self): 
     return self.user_cache   

Views.py

if request.method == 'POST': 
    user_form = userLogin(data = request.POST) 
    # You can now get user using the get_user method 
    user = user_form.get_user() 

    # Do other stuff 

Eine andere Sache, die ich möchte hinzuzufügen ist, wenn Ihr Benutzer bereits angemeldet ist, können Sie einfach request.user.username in Ihrem views.py tun, um den aktuellen Benutzer zu erhalten.

+0

Okay, ich verstehe, was Sie sagen ... aber wie ich in meiner Antwort auf @Wtower oben erwähnt habe, scheint es, dass ich mein eigenes Authentifizierungs-Backend schreiben muss, weil ich mich über die API unserer Website authentifiziere.Ich würde dann mein Backend zu AUTHENTICATION_BACKENDS in settings.py hinzufügen und Django würde es wiederum verwenden, wenn ich den Aufruf 'self.user_cache = authenticate (username = user, password = pwd) mache ', ja? –

+0

Ich folgte Ihrer Struktur und es authentifiziert gut, aber in views.py, wenn ich gehe "user = user_form.get_user()", und dann versuchen, "user.usernames" auszudrucken, bekomme ich, dass Benutzernamen kein Attribut des Benutzers ist . Die Dokumentation besagt jedoch eindeutig, dass der Benutzername ein Attribut eines Benutzerobjekts ist. Was verstehe ich nicht? –

+0

@PatJones drucken Sie den 'Benutzer' aus und lassen Sie mich wissen, was gedruckt wird. Haben Sie auch ein Benutzermodell? Bitte fügen Sie den obigen Code hinzu. – Aakash

Verwandte Themen