Utilisation de AuthenticationForm dans Django
J'essaie d'utiliser le formulaire AuthenticationForm avec django et de découvrir que je n'arrive pas à valider le formulaire. Je l'ai réduit à un test simple (en supposant que c'est correct) qui ne semble pas fonctionner. Quelqu'un peut-il voir un problème ici?
>>> from django.contrib.auth.forms import AuthenticationForm
>>> POST = { 'username': 'test', 'password': 'me', }
>>> form = AuthenticationForm(POST)
>>> form.is_valid()
False
Y a-t-il une vraie raison pour laquelle il ne validera pas? Est-ce que je l'utilise incorrectement? Je l'ai essentiellement modélisé après la propre vue de connexion de django.
3 réponses
Après quelques heures passées à trouver " pourquoi le hack il n'y a pas d'erreur de validation?!"Je cours dans cette page: http://www.janosgyerik.com/django-authenticationform-gotchas/
Le premier argument deAuthenticationForm n'est pas données! du tout:
def __init__(self, request=None, *args, **kwargs):
Donc c'est pourquoi vous devez passer req.POST aux données ou passer autre chose dans le premier argument. Il était déjà indiqué dans l'une des réponses ici à utiliser:
AuthenticationForm(data=req.POST)
, Vous pouvez également utiliser l'un des ceux-ci:
AuthenticationForm(req,req.POST)
AuthenticationForm(None,req.POST)
Le code de la fonction 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 vous voyez le code de la méthode propre 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
"Le problème" est que n'existe pas un utilisateur avec ce nom d'utilisateur et passowrd