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
?
gut, wenn ich auf mehrere Variablen zugreifen möchte, so muss ich jedes von ihnen bekommen und sehen, ob sie nicht null sind? – avi
@avi - Ja, oder senden Sie einfach das ganze Formular und keine Abschnitte davon – Sayse
naja, es ist ein 'GET', ich kann nicht wirklich sicherstellen, dass Benutzer die URL nicht bearbeiten – avi