2011-12-07 4 views
23

私はdjangoでAuthenticationFormフォームを使用しようとしていますが、検証するフォームを取得できないようです。私はそれがうまくいかない単純なテスト(それが正しいと仮定して)に向かった。誰も問題をここで見ることができますか?DjangoでAuthenticationFormを使用する

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

実際に検証されない理由はありますか?私はそれを間違って使用していますか?私は基本的にdjango自身のログインビューの後にモデル化しました。

答えて

37

試してみてください。

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

ありがとうございます。私がdjangoのデフォルトビューでそれを見逃したかどうかはわかりません。私の他のすべてのフォームは、kwargを使用せずにインスタンスにPOSTを投げます。ここで何が違うの? –

+3

メモリが使用されている場合、AuthenticationFormは他のものとわずかに異なります。 Djangoにはいくつかの矛盾があります。通常、フォームをインスタンス化するには、次のようにします。form = MyForm(request.POSTまたはNone) – Brandon

2

IS_VALID関数のコードは:あなたが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 

のクリーンな方法のコードが表示された場合

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

「問題は」それは、このユーザ名とpassowrdでユーザーを終了していないです

+0

は、あなたがこのIS_VALIDを見ている:

AuthenticationForm(data=req.POST) 

また、これらのいずれかを使用することができますか? django.forms.BaseForm?どのバージョンのdjangoを実行していますか?私はここ1.3.1にいる。これは、djangoの管理者と同じバックエンドを使用している場合、私は有効なユーザー/パスで試した... –

+0

トランクで:https://code.djangoproject.com/browser/django/trunk/django/forms/forms。 py#L119またはDjango 1.3.1 https://code.djangoproject.com/browser/django/tags/releases/1.3.1/django/forms/forms.py#L116 – Goin

+0

form.errorsの値を教えてください – Goin

13

数時間後に「なぜハックには検証エラーがありませんか?」というメッセージが表示されました。私はこのページに実行します。http://www.janosgyerik.com/django-authenticationform-gotchas/

AuthenticationFormの最初の引数がないデータです!全く:あなたがデータにreq.POSTを渡すか、最初の引数に何かを渡すために持っている理由

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

だからthatsの。これは、すでに答えの1で述べたが、ここで使用する:

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

'data ='の呼び出しが適切です。 – freb