2011-12-07 2 views
23

AuthenticationForm formunu django ile kullanmaya ve formun doğrulanacağını göremediğime karar veriyorum. Çalışmak için görünmeyen basit bir sınamaya (doğru olduğunu varsayarak) ittim. Burada sorun olan var mı?Django'da AuthenticationForm kullanma

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

Doğrulanmaması için gerçek bir neden var mı? Yanlış mı kullanıyorum? Temelde django'nun kendi giriş görünümünden sonra modelledim.

cevap

37

Dene:

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

Teşekkürler. Bunu django'nun varsayılan görünümünde nasıl kaçırdığımı bilmiyorum. Diğer tüm formlarım, bir kwarg kullanmadan, POST'u örneğe atıyorum. Burada neyin farklı olduğuna dair bir fikrin var mı? –

+3

Bellek sunulduğunda, AuthenticationForm diğerlerinden biraz farklıdır. Burada ve Django'da birkaç tutarsızlık var. Genellikle formları kullanarak örnek oluşturur: form = MyForm (request.POST veya None) – Brandon

2

is_valid fonksiyonun kodu: 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 

temiz yönteminin kodunu görürseniz

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.']} 

"sorunu" bu kullanıcı adı ve passowrd olan bir kullanıcı çıkar gelmez ise

+0

bu is_valid görüyoruz:

AuthenticationForm(data=req.POST) 

Ayrıca bunlardan birini kullanabilir? django.forms.BaseForm? Hangi django sürümünü kullanıyorsunuz? 1.3.1 buradayım. Bu django admin ile aynı arka ucunu kullanıyorsa, geçerli bir kullanıcı/pass ile denedim ... –

+0

Gövde: https://code.djangoproject.com/browser/django/trunk/django/forms/forms. py # L119 veya Django 1.3.1'de https://code.djangoproject.com/browser/django/tags/releases/1.3.1/django/forms/forms.py#L116 – Goin

+0

Bana form.errors değerini söyle – Goin

13

Birkaç saatten sonra "Neden hack neden doğrulama hatası yok?" Bu sayfanın içine çalıştırın: http://www.janosgyerik.com/django-authenticationform-gotchas/

AuthenticationForm ilk argüman değil veri olduğunu! Hiç: Eğer verilere req.POST geçmesi ya da ilk argüman başka bir şey geçmek zorunda neden

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

Yani bu. Zaten cevapları birinde ifade edilmiştir burada kullanılacak:

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

'data =' hakkında iyi çağrı. – freb