Django KeyError bei /register/
Ich habe eine Anmeldung, die Benutzern das registrieren und ich habe Schwierigkeiten, es zu beheben.
Das problem ist, wenn ein Nutzer ein single-Feld statt das ganze Formular zum Beispiel eine E-Mail . Ich bekomme diese Fehlermeldung
KeyError at /register/
password
Request Method: POST
Request URL: http://127.0.0.1:8000/register/
File "C:\Python26\Lib\site-packages\django\forms\forms.py" in _get_errors
115. self.full_clean()
File "C:\Python26\Lib\site-packages\django\forms\forms.py" in full_clean
271. self._clean_form()
File "C:\Python26\Lib\site-packages\django\forms\forms.py" in _clean_form
299. self.cleaned_data = self.clean()
File "C:\o\17\mysite\pet\forms.py" in clean
31. if self.cleaned_data['password'] != self.cleaned_data['password1']:
Exception Type: KeyError at /register/
Exception Value: password
Habe ich versucht zu beheben, diese Lösung zu verwenden, wenn . Wenn Benutzer a übermittelt, Benutzername oder alle anderen erforderlichen Feld -, Prozess-form sonst wieder die ursprüngliche form.
aber ich bekomme immer noch den gleichen Fehler.
Dies ist mein bearbeitet views.py (auf der Seite unten ist meine ursprüngliche RegistrationForm)
def PetRegistration(request):
if request.user.is_authenticated():
return HttpResponseRedirect(reverse('world:HappyLand'))
if request.method =='POST':
form = UserRegistration(request.POST)
if form.is_valid():
username = form.cleaned_data['username']
if username:
email=form.cleaned_data['email']
if email:
password=form.cleaned_data['password']
if password:
user = User.objects.create_user(
username=form.cleaned_data['username'],
email=form.cleaned_data['email'],
password=form.cleaned_data['password']
)
user.is_active = True
user.first_name = form.cleaned_data['name']
user.save()
person = authenticate(
username=form.cleaned_data['username'],
password=form.cleaned_data['password']
)
Person.objects.create(user_id=user.id,
name=form.cleaned_data['name'],birthday=form.cleaned_data['birthday'])
login(request, person)
return HttpResponseRedirect(reverse('world:HappyLand'))
return render(request, 'register.html', {'form': UserRegistration()})
Wie kann ich diesen Fehler beheben und wie könnte ich die Anzeige einer Fehlermeldung auf die anderen Felder, die der Benutzer nicht ausfüllen wie "Error Fehlen, Feld , Füllen Sie Bitte das Feld".
def PetRegistration(request):
if request.user.is_authenticated():
return HttpResponseRedirect(reverse('world:HappyLand'))
if request.method =='POST':
form = UserRegistration(request.POST)
if form.is_valid():
user = User.objects.create_user(
username=form.cleaned_data['username'],
email=form.cleaned_data['email'],
password=form.cleaned_data['password']
)
user.is_active = True
user.first_name = form.cleaned_data['name']
user.save()
person = authenticate(
username=form.cleaned_data['username'],
password=form.cleaned_data['password']
)
Person.objects.create(user_id=user.id,
name=form.cleaned_data['name'],birthday=form.cleaned_data['birthday'])
login(request, person)
return HttpResponseRedirect(reverse('world:HappyLand'))
return render(request, 'register.html', {'form': UserRegistration()})
Meine forms.py
class UserRegistration(forms.Form):
username = forms.CharField()
name = forms.CharField()
email = forms.EmailField()
birthday = forms.DateField(widget=extras.SelectDateWidget(years=range(1950, 2012)))
password = forms.CharField(
widget=forms.PasswordInput(render_value=False)
)
password1 = forms.CharField(
label=(u'Verify Password'),
widget = forms.PasswordInput(render_value=False)
)
def clean_username(self):
username = self.cleaned_data['username']
try:
User.objects.get(username=username)
except User.DoesNotExist:
return username
raise forms.ValidationError(
"That user is already taken , please select another ")
def clean(self):
if self.cleaned_data['password'] != self.cleaned_data['password1']:
raise forms.ValidationError("The password does not match ")
return self.cleaned_data
Meine models.py
class Person(models.Model):
user = models.ForeignKey(User)
name = models.CharField(max_length=100, blank=True)
birthday = models.DateField(blank=True,null=True)
def __unicode__(self):
return self.name
Du musst angemeldet sein, um einen Kommentar abzugeben.
Problem ist, mit dem
clean()
. Inclean()
Sie versuchen, Zugriff auf Feldpassword
auf formcleaned_data
.password
werden nur aufcleaned_data
wenn der Benutzer befüllt dieses Feld. So müssen Sie prüfen, obpassword
ist es incleaned_data
bevor Sie versuchen, darauf zuzugreifen.Ändern Sie Ihre
clean()
:Können Sie eine Schlüsselwort-argument
error_messages
auf ein Formularfeld, zeigt Fehlermeldung wie "Error Fehlen, Feld , Füllen Sie Bitte das Feld".Es ist ein Fehler in deiner Ansicht.
is_valid() füllt Fehler auf die form, aber das gleiche Formular-Instanz gesendet werden müssen, um die Vorlage, so dass Sie zugreifen können, die Fehler auf dem Formular-Felder.
Aber in Ihrem Blick, Sie haben nur einen Ruf zu
render()
die aufgerufen wird, auch im Falle eines ungültigen Formulars auf eine post-Anfrage. Und in diesemrender()
erstellen Sie eine neue Instanz der form. Also, diese neue form, die Sie senden die Vorlage wird nicht alle Fehler.So, so dass leichte änderungen an Ihrem Blick:
Hinweis in Ihrem Blick, ich habe
form=UserRegistration()
vor der Kontrolle, wenn seine POST-Anforderung, und haben Sie den Kommentar auf zwei Orte, wo wir instanziierenUserRegistration
. Und dann inrender()
haben, senden Sie dieseform
.Dann Ihre
{{form.username.errors}}
arbeiten.Ich gerade geändert forms.py
form.errors
zum anzeigen von Fehlernif form.is_valid()
erstellenelse
dann unter dem anderen rufen Sie dieform.errors