2016-03-03 22 views
7

Ich habe eine benutzerdefinierte Django Login-Seite. Ich möchte eine Ausnahme auslösen, wenn der Benutzername oder das Passwort leer sind. Wie kann ich das machen?Django benutzerdefinierte Login-Seite

Mein view.py Login-Methode:

def user_login(request): 
    context = RequestContext(request) 
    if request.method == 'POST': 
     # Gather the username and password provided by the user. 
     # This information is obtained from the login form. 
     username = request.POST['username'] 
     password = request.POST['password'] 
     user = authenticate(username=username, password=password) 
     print("auth",str(authenticate(username=username, password=password))) 

     if user: 
      # Is the account active? It could have been disabled. 
      if user.is_active: 
       login(request, user) 
       return HttpResponseRedirect('/') 
     else: 
      return HttpResponse("xxx.") 
    else: 
     # Bad login details were provided. So we can't log the user in. 
     print ("Invalid login details: {0}, {1}".format(username, password)) 
     return HttpResponse("Invalid login details supplied.") 
    else: 
     return render_to_response('user/profile.html', {}, context) 

habe ich versucht, diese und es hat nicht funktioniert: Dies ist forms.py

def clean_username(self): 
    username = self.cleaned_data.get('username') 
    if not username: 
     raise forms.ValidationError('username does not exist.') 
+2

Können Sie bitte die Frage mit der richtigen Vertiefung aktualisieren – Sayse

+1

definieren nur 'clean_username (Selbst-): Wenn nicht self.cleaned_data [ 'username']: Validation ('')' Methode in Form entspricht. –

+0

Hallo, ich lege es nur zum Testen, xxx ist eine HTML-Seite. – chazefate

Antwort

6

Sie können Login-Ansicht verwenden, die von Django bereitgestellt wird. So sollte Ihre login.html wie dieses Beispiel aussehen.

<form class="login" method="POST" action="/login/"> 

    {% csrf_token %} 

    {{form.as_p}} 

    <li><input type="submit" class="logBut" value="Log in"/></li> 
    </form> 

Und erinnern Sie sich urls.py!

url(r'^login/$','django.contrib.auth.views.login', {'template_name': '/login.html'}), 
+0

Großartig, es hat richtig funktioniert. Vielen Dank. – chazefate

+0

Ich hatte keine form.as_p. – chazefate

4

Der richtige Ansatz ist forms zu verwenden, anstatt die Variablen direkt von request.POST zu holen. Django validiert dann die Formulardaten und zeigt Fehler an, wenn das Formular in der Vorlage gerendert wird. Wenn ein Formularfeld erforderlich ist, zeigt Django automatisch einen Fehler an, wenn das Feld leer ist. Sie müssen dazu nicht einmal eine clean_<field_name>-Methode schreiben.

Django hat bereits eine built in login view. Am einfachsten ist es, dies zu verwenden, anstatt selbst zu schreiben. Wenn Sie immer noch Ihre eigene Ansicht schreiben möchten, werden Sie es immer noch nützlich finden, zu sehen, wie Django es macht.

+1

Ich verstehe nicht, warum jeder die integrierte Login-Ansicht so viel verwenden möchte? Entschuldige, dass ich einen alten Thread wiederbelebt habe, aber gibt es eine einfache Möglichkeit, wie ich diese Ansicht ändern könnte? Wie in, Klassen zu Eingabeelementen und anderen Attributen hinzufügen? – Zeretil

+0

Sie sagen * Ich verstehe nicht, warum jeder die eingebaute Login-Ansicht so sehr benutzen möchte *. Ich sehe es anders herum - ich verstehe nicht, warum Sie Ihre eigene Sichtweise schreiben sollten, die Bugs oder noch schlimmere Sicherheitsmängel haben könnte, wenn es eine gut getestete, weit verbreitete Ansicht in Django gibt. – Alasdair

+0

@Zeretil Ich kann nicht mit dem Hinzufügen von Klassen zu Eingabeelementen helfen, das ist ein Thema für diese Frage. Ich nehme an, dass diese Frage bereits anderswo auf Stack Overflow beantwortet wurde, und wenn Sie es nicht finden können, dann ist es besser, eine neue Frage zu beginnen, als in den Kommentaren zu fragen. – Alasdair

Verwandte Themen