2016-03-03 16 views
7

Mam niestandardową stronę logowania Django. Chcę rzucić wyjątek, gdy pola nazwy użytkownika lub hasła są puste. Jak mogę to zrobić?Django niestandardowa strona logowania

Moja view.py dziennik w metodzie:

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) 

próbowałem tego i to nie działa: To forms.py

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

Czy należy zaktualizować pytanie z poprawną wcięcia – Sayse

+1

wystarczy zdefiniować 'clean_username (self): jeśli nie self.cleaned_data [ 'login']: ValidationError ('')' metody w odpowiednim formularzu. –

+0

Witam, umieściłem to tylko do testowania, xxx to strona html. – chazefate

Odpowiedz

6

Możesz użyć widoku logowania, który jest dostarczany przez Django. Zatem twój login.html powinien wyglądać jak ten przykład.

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

    {% csrf_token %} 

    {{form.as_p}} 

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

Pamiętaj też o urls.py!

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

Świetnie to działało dobrze. Dziękuję ci bardzo. – chazefate

+0

Nie miałem form.as_p. – chazefate

4

Prawidłowe podejście jest użycie forms, zamiast pobierać zmienne bezpośrednio z request.POST. Django następnie sprawdzi dane formularza i wyświetli błędy, gdy formularz zostanie wyrenderowany w szablonie. Jeśli pole formularza jest wymagane, wówczas Django automatycznie wyświetli błąd, gdy pole jest puste, nie musisz nawet pisać o tym w metodzie clean_<field_name>.

Django ma już built in login view. Najłatwiejszym sposobem jest użycie tego zamiast pisania własnego. Jeśli nadal chcesz napisać swój własny widok, nadal będzie ci się przydać, jak to robi Django.

+1

Nie rozumiem, dlaczego wszyscy tak bardzo chcą korzystać z wbudowanego widoku logowania? Przepraszamy za przywrócenie starego wątku, ale czy istnieje prosty sposób, którego mi brakuje, aby zmienić ten widok? W ramach dodawania klas do elementów wejściowych i innych atrybutów? – Zeretil

+0

Mówisz * Nie rozumiem, dlaczego wszyscy tak bardzo chcą używać wbudowanego widoku logowania *. Patrzę na to w inny sposób - nie widzę powodu, dla którego chciałbyś napisać własny pogląd, który mógłby mieć błędy lub jeszcze gorsze luki w zabezpieczeniach, gdy jest dobrze przetestowany, szeroko stosowany widok zawarty w Django. – Alasdair

+0

@Zeretil Nie mogę pomóc w dodawaniu klas do elementów wejściowych, to nie jest temat na to pytanie. Sądzę, że na to pytanie już wcześniej udzielono odpowiedzi w Stack Overflow, a jeśli nie możesz go znaleźć, lepiej jest zacząć nowe pytanie niż pytać w komentarzach. – Alasdair