2011-12-07 12 views
23

Próbuję użyć formularza AuthenticationForm z django i dowiedzieć się, że nie mogę uzyskać formularza do sprawdzenia poprawności. Roztrząsnęłam to do prostego testu (zakładając, że jest poprawny), który wydaje się nie działać. Czy ktoś może zobaczyć tutaj problem?Using AuthenticationForm w Django

>>> from django.contrib.auth.forms import AuthenticationForm 
>>> POST = { 'username': 'test', 'password': 'me', } 
>>> form = AuthenticationForm(POST) 
>>> form.is_valid() 
False 

Czy istnieje prawdziwy powód, dla którego nie zostanie zatwierdzony? Czy używam go niepoprawnie? Zasadniczo zamodelowałem go po widoku logowania django.

Odpowiedz

37

Spróbuj:

form = AuthenticationForm(data=request.POST) 
+0

Dzięki. Nie wiem, jak to przegapiłem w domyślnym widoku django. Wszystkie moje inne formularze Wrzucam POST do instancji, bez użycia kwarg. Masz pojęcie, co tu jest innego? –

+3

Jeśli obsługiwana jest pamięć, funkcja AuthenticationForm jest nieco inna niż pozostałe. W Django istnieje kilka niespójności. Zazwyczaj uruchamiam formularze za pomocą: form = MyForm (request.POST lub None) – Brandon

2

Kod funkcji is_valid:

return self.is_bound and not bool(self.errors) 


>>> form.errors 
{'__all__': [u'Please enter a correct username and password. Note that both fields are case-sensitive.']} 

Jeśli pojawi się kod metody czyste od AuthenticationForm

def clean(self): 
    username = self.cleaned_data.get('username') 
    password = self.cleaned_data.get('password') 

    if username and password: 
     self.user_cache = authenticate(username=username, password=password) 
     if self.user_cache is None: 
      raise forms.ValidationError(_("Please enter a correct username and password. Note that both fields are case-sensitive.")) 
     elif not self.user_cache.is_active: 
      raise forms.ValidationError(_("This account is inactive.")) 
    self.check_for_test_cookie() 
    return self.cleaned_data 

„Problem” jest to, że nie wychodzi użytkownika z tej nazwy użytkownika i passowrd

+0

Jeżeli widzisz ten is_valid? django.forms.BaseForm? Jaką wersję django używasz? Jestem na 1.3.1 tutaj. Jeśli używasz tego samego backendu co administrator django, próbowałem z prawidłowym użytkownikiem/pass ... –

+0

W trunk: https://code.djangoproject.com/browser/django/trunk/django/forms/forms. py # L119 lub w Django 1.3.1 https://code.djangoproject.com/browser/django/tags/releases/1.3.1/django/forms/forms.py#L116 – Goin

+0

Powiedz mi wartość form.errors – Goin

13

Po kilku godzinach spędzonych na szukaniu "Dlaczego włamanie nie ma błędu sprawdzania poprawności ?!" Biegnę do tej strony: Pierwszy argument http://www.janosgyerik.com/django-authenticationform-gotchas/

AuthenticationForm „s jest dane! w ogóle:

def __init__(self, request=None, *args, **kwargs): 

Więc to dlaczego trzeba przejść req.POST danych lub przekazać coś innego w pierwszym argumencie. Został już wspomniano w jednym z odpowiedzi tutaj, aby użyć:

AuthenticationForm(data=req.POST) 

Można również użyć jednego z nich:

AuthenticationForm(req,req.POST) 
AuthenticationForm(None,req.POST) 
+0

Dobre wywołanie w "data =". – freb