2016-09-21 4 views
1

私は、一日中、これを理解しようとしましたが、どこから問題が発生しているのかは分かりません。WEIRD Django AuthenticationFormの動作

私はDjangoAuthenticationFormですが、何らかの形でデータを送信しているようですが、検証されていないようです。

forms.py

class LoginForm(AuthenticationForm): 
    username = forms.CharField(widget=forms.TextInput(attrs={'name': 'username'})) 
    password = forms.CharField(widget=forms.PasswordInput(attrs={'name': 'password'})) 

views.py

def index(request): 
    template = 'myapp/login.html' 
    if request.method == "POST": 
     print request.POST #prints QueryDict with its data 
     reg = LoginForm(request.POST or None) 
     if reg.is_valid(): 
      return HttpResponse('Success: Form is valid!')    
     else: 
      return HttpResponse('Error: Form not valid') 

    loginform = LoginForm() 
    context = {'loginform':loginform} 
    return render(request, template, context) 

HTML

<form method="post" action="."> 
     {% csrf_token %} 
     <h2>Sign in</h2> 
     <p class="text-danger">{{loginform.errors}}</p> 
     {{ loginform.as_p }}  
     <button name = "signin" type="submit" value="0">Sign in</button> 
    </form> 

{u'username ':[u'yax']、u'csrfmiddlewaretoken ':[u'r8y1PaVNjxNWypdzP MaFe1ZL7IkE1O7Hw0yRPQTSipW36z1g7X3vPS5qMMX56byj']、u'password ':[u'sdfdsfsddfs'] 、私のviews.pyプリントのQueryDict 210 u'signin ':[u'0']}しかし、reg.is_valid()falseを返し続けます。

EDIT

私はまたreg.errorsをプリントアウトしようとしたが、それは何も印刷されません。以下の変更を行う

+0

何が起きているかを確認する最良の方法は、失敗した後にreg.errorsを印刷することです。 – Aquiles

+0

@Aquilesは空文字列を出力します。 – Yax

答えて

1

試してみてください。

reg = LoginForm(data=request.POST) 

AuthenticationFormは、それがdata引数を必要とすることで、わずかに異なっています。

AuthenticationFormもそれをチェックするので、実際に有効なユーザー名とパスワードの組み合わせ(既存のユーザーに対応する)でテストする必要があります。

+0

'AuthenticationForm.is_valid()'は 'authenticate()'を処理しますか? – Yax

+0

はい、 'AuthenticationForm'のクリーンメソッドは、そのようなユーザが存在することを確認するためにシーンの裏側で' authenticate'を呼び出します。 – user6731765