2016-05-19 7 views
3

次は私のフォームコードです:私のDjangoフォームで検証エラーが発生しないのはなぜですか?

class ConfirmEmailForm(forms.Form): 
    email = forms.EmailField() 
    subscribe = forms.IntegerField() 
    code = forms.CharField(max_length=80) 

    def clean_subscribe(self): 
     value = bool(self.cleaned_data['subscribe']) 
     self.cleaned_data['subscribe'] = value 
     return value 

    def clean(self): 
     cleaned_data = super(ConfirmEmailForm, self).clean() 
     email = cleaned_data['email'] 
     code = cleaned_data['code'] 
     user = User.objects.filter(username=email).first() 
     if not user: 
      raise forms.ValidationError('Email not found') 
     self.cleaned_data['user'] = user 
     if user.emailverification.is_key_expired(): 
      raise forms.ValidationError('Link expired, please regenerate') 
     if not user.emailverification.key == code: 
      raise forms.ValidationError('Invalid Link') 
     return cleaned_data 

私はGETリクエストのためにこのフォームを使用しています。 emailフィールドなしでリクエストを送信すると、エラーはcleaned_dataに発生すると予想されましたが、エラーは発生せず、次の行にKeyErrorが表示されます。

明らかに、それが存在しないので、KeyErrorが発生します。しかし、なぜ私の質問は、エラーはsuper(ConfirmEmailForm, self).clean()で提起されていません。なぜそれが起こっている

Environment: 


Request Method: GET 
Request URL: http://localhost:8000/user/confirm/?code=g&subscribe=1 

Django Version: 1.9.6 
Python Version: 3.5.1 
Installed Applications: 
['django.contrib.admin', 
'django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'nightreads', 
'nightreads.posts', 
'nightreads.user_manager'] 
Installed Middleware: 
['django.middleware.security.SecurityMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.common.CommonMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
'django.middleware.clickjacking.XFrameOptionsMiddleware'] 



Traceback: 

File "/Users/avi/.virtualenvs/nightreads/lib/python3.5/site-packages/django/core/handlers/base.py" in get_response 
    149.      response = self.process_exception_by_middleware(e, request) 

File "/Users/avi/.virtualenvs/nightreads/lib/python3.5/site-packages/django/core/handlers/base.py" in get_response 
    147.      response = wrapped_callback(request, *callback_args, **callback_kwargs) 

File "/Users/avi/.virtualenvs/nightreads/lib/python3.5/site-packages/django/views/generic/base.py" in view 
    68.    return self.dispatch(request, *args, **kwargs) 

File "/Users/avi/.virtualenvs/nightreads/lib/python3.5/site-packages/django/views/generic/base.py" in dispatch 
    88.   return handler(request, *args, **kwargs) 

File "/Users/avi/Documents/code/nightreads/nightreads/user_manager/views.py" in get 
    54.   if form.is_valid(): 

File "/Users/avi/.virtualenvs/nightreads/lib/python3.5/site-packages/django/forms/forms.py" in is_valid 
    161.   return self.is_bound and not self.errors 

File "/Users/avi/.virtualenvs/nightreads/lib/python3.5/site-packages/django/forms/forms.py" in errors 
    153.    self.full_clean() 

File "/Users/avi/.virtualenvs/nightreads/lib/python3.5/site-packages/django/forms/forms.py" in full_clean 
    363.   self._clean_form() 

File "/Users/avi/.virtualenvs/nightreads/lib/python3.5/site-packages/django/forms/forms.py" in _clean_form 
    390.    cleaned_data = self.clean() 

File "/Users/avi/Documents/code/nightreads/nightreads/user_manager/forms.py" in clean 
    30.   email = cleaned_data['email'] 

Exception Type: KeyError at /user/confirm/ 
Exception Value: 'email' 

ここで完全なトレースバックがありますか?そして私はこれをどのように解決するのですか? cleanの有効なデータとクリーンデータにアクセスする適切な方法は何ですか?

答えて

2

クリーンメソッドでエラーが発生した場合は、エラーのリストに追加されますが、それは発生しません。

コード行hereがあります。あなたは、その後に対してチェックすることができた -

 except ValidationError as e: 
      self.add_error(name, e) 

あなたは値が見つからない場合Noneを返しますどのcleaned_data.get('email')を使用して、それを解決することができます。

+0

複数の変数にアクセスしたいのであれば、それぞれを取得してヌルでないかどうか確認する必要がありますか? – avi

+0

@avi - はい、それだけではなく、フォーム全体を提出します。 – Sayse

+0

それは 'GET'です。ユーザーがURLを編集していないことを確認できません – avi

0

クリーンメソッドを使用すると、このメソッドによって生成されたValidationErrorは特定のフィールドに関連付けられないためです。

これ以外のカスタムを作成してください。

2

cleaned_data['email']の前にエラーが存在するかどうかを確認してください。

def clean(self): 
    cleaned_data = super(ConfirmEmailForm, self).clean() 

    if any(self.errors): 
     return self.errors 

    email = cleaned_data['email'] 
    code = cleaned_data['code'] 

これはうまくいきます。

関連する問題