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.

24
demandé sur Mike Shultz 2011-12-07 23:22:19

3 réponses

Essayez:

form = AuthenticationForm(data=request.POST)
43
répondu Brandon 2011-12-07 21:05:37

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 de

AuthenticationForm 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)
14
répondu darkless 2014-02-01 22:33:09

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

2
répondu Goin 2011-12-07 19:36:24