2011-12-07 9 views
23

Sto tentando di utilizzare il modulo AuthenticationForm con django e scoprire che non riesco a ottenere il modulo da convalidare. L'ho ridotto a un semplice test (supponendo che sia corretto) che non sembra funzionare. Qualcuno può vedere un problema qui?Utilizzo di AuthenticationForm in Django

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

C'è un motivo reale che non verrà convalidato? Sto usando in modo errato? L'ho praticamente modellato dopo la vista di login di django.

risposta

37

Prova:

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

Grazie. Non sono sicuro di quanto mi sia mancato nella vista predefinita di Django. Tutti i miei altri moduli mi limitano a inserire POST nell'istanza, senza utilizzare un kwarg. Qualche idea di cosa è diverso qui? –

+3

Se la memoria è disponibile, AuthenticationForm è leggermente diverso dagli altri. Ci sono alcune incongruenze qua e là a Django. Tipicamente istanzio i moduli usando: form = MyForm (request.POST o None) – Brandon

2

Il codice della funzione 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.']} 

Se si vede il codice del metodo pulito di 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 

"Il problema" è che non esce un utente con questo nome utente e passowrd

+0

Dove stai vedendo questo is_valid? django.forms.BaseForm? Quale versione di Django stai correndo? Sono su 1.3.1 qui. Se si utilizza lo stesso backend dell'amministratore di django, ho provato con un utente/passaggio valido ... –

+0

Nel trunk: https://code.djangoproject.com/browser/django/trunk/django/forms/forms. py # L119 o in Django 1.3.1 https://code.djangoproject.com/browser/django/tags/releases/1.3.1/django/forms/forms.py#L116 – Goin

+0

Dimmi il valore di form.errors – Goin

13

Dopo alcune ore trascorse a cercare "Perché l'hack non ci sono errori di convalida ?!" Mi imbatto in questa pagina: http://www.janosgyerik.com/django-authenticationform-gotchas/

AuthenticationForm 's primo argomento non è dati! a tutti:

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

Allora ecco perché devi passare req.POST ai dati o di passare qualche altra cosa nel primo argomento. E 'stato già detto in una delle risposte qui per utilizzare:

AuthenticationForm(data=req.POST) 

È inoltre possibile utilizzare uno di questi:

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

Good call su 'data ='. – freb

Problemi correlati