2011-12-07 28 views
23

Estoy intentando usar el formulario AuthenticationForm con django y descubriendo que parece que no puedo obtener el formulario para validarlo. Lo reduje a una prueba simple (suponiendo que sea correcto) que no parece funcionar. ¿Alguien puede ver un problema aquí?Usando AuthenticationForm en Django

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

¿Hay alguna razón real que no valide? ¿Lo estoy usando incorrectamente? Básicamente lo he modelado después de la vista de inicio de sesión de django.

Respuesta

37

Probar:

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

Gracias. No estoy seguro de cómo me perdí eso en la vista predeterminada de django. Todas mis otras formas simplemente tiro POST en la instancia, sin usar un kwarg. ¿Alguna idea de qué es diferente aquí? –

+3

Si la memoria se sirve, AuthenticationForm es ligeramente diferente a los demás. Hay algunas inconsistencias aquí y allá en Django. Típicamente instanciamos formularios usando: form = MyForm (request.POST o None) – Brandon

2

El código de la función 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.']} 

Si ve el código de limpieza método de 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 

"El problema" es que no sale de un usuario con este nombre de usuario y passowrd

+0

¿Dónde están viendo esto is_valid? django.forms.BaseForm? ¿Qué versión de django estás ejecutando? Estoy en 1.3.1 aquí. Si esto está usando el mismo back-end que el administrador django, lo he intentado con un usuario/pase válido ... –

+0

En el tronco: https://code.djangoproject.com/browser/django/trunk/django/forms/forms. py # L119 o en Django 1.3.1 https://code.djangoproject.com/browser/django/tags/releases/1.3.1/django/forms/forms.py#L116 – Goin

+0

Dime el valor de form.errors – Goin

13

Después de unas horas dedicadas a encontrar "¿Por qué el truco no es un error de validación?" Me encuentro con esta página: primer argumento http://www.janosgyerik.com/django-authenticationform-gotchas/

AuthenticationForm 's no es datos! en absoluto:

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

así que por eso usted tiene que pasar req.POST a los datos o pasar algo más en el primer argumento. Ya se dijo en una de las respuestas aquí para utilizar:

AuthenticationForm(data=req.POST) 

También puede utilizar uno de estos:

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

Buena llamada en 'data ='. – freb