2016-05-19 13 views
3

Folgende ist meine Form Code:Warum erhöht mein Django-Formular keinen Validierungsfehler?

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 

ich für eine GET-Anfrage dieses Formular verwenden. Jetzt, wenn ich die Anfrage ohne email Feld sende, habe ich erwartet, dass der Fehler um cleaned_data ausgelöst wird, aber es löst keinen Fehler und eher bekomme ich KeyError bei der nächsten Zeile.

Offensichtlich wird es eine KeyError erhöhen, da es abwesend ist. Aber meine Frage, warum der Fehler nicht bei super(ConfirmEmailForm, self).clean() selbst ausgelöst wird.

Hier ist die vollständige Rückverfolgung:

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' 

Warum es passiert? Und wie löse ich das? Was ist der richtige Weg für den Zugriff auf validierte und bereinigte Daten in clean?

Antwort

2

Wenn die Bereinigungsmethode einen Fehler erhält, wird sie zur Liste der Fehler hinzugefügt, sie wird nicht ausgelöst.

Sie können die Codezeile here finden.

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

Man könnte es beheben cleaned_data.get('email') unter Verwendung, welche None zurück, wenn der Wert nicht gefunden wird - die Sie dann gegen überprüfen.

+0

gut, wenn ich auf mehrere Variablen zugreifen möchte, so muss ich jedes von ihnen bekommen und sehen, ob sie nicht null sind? – avi

+0

@avi - Ja, oder senden Sie einfach das ganze Formular und keine Abschnitte davon – Sayse

+0

naja, es ist ein 'GET', ich kann nicht wirklich sicherstellen, dass Benutzer die URL nicht bearbeiten – avi

0

Ich denke, das ist, weil wenn Sie die clean-Methode Any ValidationError von dieser Methode ausgelöst wird nicht mit einem bestimmten Feld zugeordnet werden;

Versuchen Sie, eine benutzerdefinierte Ausnahme zu erstellen.

2

Bevor Sie cleaned_data['email'] tun, prüfen Sie, ob ein Fehler vorhanden ist oder nicht.

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

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

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

Hoffe, das wird für Sie arbeiten.

Verwandte Themen