2011-06-26 10 views
0

ログインフォームに検証コードフィールドを追加します。 したがって、charFieldを追加して検証コードを生成し、検証コードをrequest.sessionに保存したauthentication_formを書きます。 しかし、ログインフォームリクエストを送信すると、私のauthentication_formで、セッションの認証コードとclean_data["verifycode"]、 を比較することができません。ここDjangoのカスタムログインフォームで、検証コードフィールドがあり、リクエストがNULLです。

class MyAuthenticationForm(AuthenticationForm): 
    verifyimg = forms.CharField(label="verifycode", widget=vericonf.CaptchaWidget) 


    def __init__(self, request=None, *args, **kwargs): 
     self.request = request 
     kwargs_new = {'error_class': DivErrorList} 
     kwargs.update(kwargs_new) 
     #elf.error_class = DivErrorList 
     super(MyAuthenticationForm, self).__init__(*args, **kwargs) 


    def as_div(self): 
     "Returns this form rendered as HTML div." 
     return self._html_output(
      normal_row=u'<div%(html_class_attr)s style="float:left;"><div class="formlabel">%(label)s</div><div class="formfield">%(field)s%(help_text)s</div><div class="formerror">%(errors)s</div></div>', 
      error_row=u'<div>%s</div>', 
      row_ender=u'</div></div>', 
      help_text_html=u'<div style="float:left;"><span class="helptext">%s</span></div>', 
      errors_on_separate_row=False) 

    def clean_verifyimg(self): 
     pass 

    def clean(self): 
     vericode = "" 
     username = self.cleaned_data.get('username') 
     password = self.cleaned_data.get('password') 

     if self.request and self.request.session and self.request.session.get("verifyimg"): 
      vericode = self.request.session.get("verifyimg") 

     print vericode ###HERE request.session is Null then I can't compare vericode and verify now.How to do it? 

     verify = self.cleaned_data.get('verifyimg') 
     print verify 

     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.")) 
     if verify and vericode: 
      if verify != vericode: 
       raise forms.ValidationError("verify code is wrong.pls Try again!") 

     self.check_for_test_cookie() 

     return self.cleaned_data 

答えて

1

問題は「request.method」が「POST」と「AuthenticationForm」の場合Django login view doesn't pass 'request' to 'authentication_form'は「要求」キーワード引数を期待していることです。

私はこの問題をこのように解決してきました:

は、ビューラッピング「django.contrib.auth.login」に私のコードを入れてください。

あなたはまだ

def custom_login(request, *args, **kwargs): 
    if request.method == 'POST': 
     form = MyAuthenticationForm(data=request.POST, request=request) 
     # Here you take care of your form validation and interaction with request 

    return login(request, *args, **kwargs) 

注 'データ' と '要求' をこの

url(r'^accounts/login/$', 
     'myapp.views.custom_login', 
     {'template_name': 'registration/login.html', 
     'authentication_form': MyAuthenticationForm 
     }, 
     name='auth_login'), 

のようなあなたのurls.pyを設定し、あなたのviews.pyでこれをputingあなたの 'MyAuthenticationForm' を使用することができます引数はキーワード引数でなければなりません。

関連する問題