Django propre méthode de jeter KeyError sur le POST
Je suis un KeyError pour "mot de passe" lorsque j'essaie d'envoyer mon formulaire.
trace:
Request Method: POST
Request URL: http://localhost:8000/register/
Django Version: 1.2.1
Python Version: 2.7.0
Installed Applications:
['django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'djangoproject1.authentication']
Installed Middleware:
('django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware')
Traceback:
File "C:\Python27\lib\site-packages\django\core\handlers\base.py" in get_response
100. response = callback(request, *callback_args, **callback_kwargs)
File "C:\Users\jec23\My Java Projects\djangoproject1\src\djangoproject1\authentication\views.py" in register
20. if rf.is_valid() and pf.is_valid():
File "C:\Python27\lib\site-packages\django\forms\forms.py" in is_valid
121. return self.is_bound and not bool(self.errors)
File "C:\Python27\lib\site-packages\django\forms\forms.py" in _get_errors
112. self.full_clean()
File "C:\Python27\lib\site-packages\django\forms\forms.py" in full_clean
268. self._clean_form()
File "C:\Python27\lib\site-packages\django\forms\forms.py" in _clean_form
296. self.cleaned_data = self.clean()
File "C:\Users\jec23\My Java Projects\djangoproject1\src\djangoproject1\authentication\forms.py" in clean
16. if self.cleaned_data['cpassword']!=self.cleaned_data['password']:
Exception Type: KeyError at /register/
Exception Value: 'password'
vues:
def register(request):
if request.method == 'POST':
rf = forms.RegisterForm(request.POST)
pf = forms.ProfileForm(request.POST)
if rf.is_valid() and pf.is_valid():
newuser = User(username=rf.cleaned_data['username'],email=rf.cleaned_data['email'])
newuser.set_password(rf.cleaned_data['password'])
newuser.save()
profile = pf.save(commit=False)
profile.user = newuser
profile.save()
return HttpResponseRedirect("/register-success/")
else:
return render_to_response("authentication/index.html", {'form1': rf, 'form2':pf})
else:
return main(request)
formes:
class RegisterForm(forms.Form):
username = forms.CharField(min_length=6,max_length=15)
password = forms.CharField(min_length=6,max_length=15,widget = forms.PasswordInput())
cpassword = forms.CharField(label='Confirm Password',widget = forms.PasswordInput())
email = forms.EmailField(label='E-mail Address')
def clean(self):
if self.cleaned_data['cpassword']!=self.cleaned_data['password']:
raise forms.ValidationError("Passwords don't match")
return self.cleaned_data
class ProfileForm(forms.ModelForm):
phonenumber = forms.CharField(label='Phone Number')
class Meta:
model = UserProfile
exclude = ('user')
pouvez-vous poster le code qui est à l'aide de ce formulaire?
inclus afficher le code
Pouvez-vous poster le code de modèle?
modèle publié
Est-ce le message d'erreur que vous obtenez pour
inclus afficher le code
Pouvez-vous poster le code de modèle?
modèle publié
Est-ce le message d'erreur que vous obtenez pour
username
champ? Required. 30 characters or fewer. Letters, numbers and @/./+/-/_ characters
OriginalL'auteur JPC | 2010-08-20
Vous devez vous connecter pour publier un commentaire.
Aha! Le message d'erreur de validation que vous voyez est en fait pas un message d'erreur de validation. Laissez-moi vous expliquer. Lorsque vous affichez le formulaire type de l'instance à l'aide de
as_p
, il rend chaque champ de la manière suivante:La chaîne
Required. 30 characters or fewer. Letters, numbers and @/./+/-/_ characters
que vous voyez à la droite du champ n'est rien, mais le texte d'aide. Ce texte d'aide est prise à partir du modèle de définition - vous pouvez le vérifier en visitantdjango/contrib/auth/models.py
et l'inspection de la définition deUser
classe.Lorsque vous remplacez la
username
de terrain, vous êtes à l'exclusion d'un texte d'aide. Naturellement, le "erreur" disparaît.Afin de vérifier cette théorie, effectuez les opérations suivantes dans votre
main
méthode.Mise à jour
Cette ligne peut poser des problèmes lorsque l'utilisateur ne fournit pas un ou deux de
password
etcpassword
. Essayez par exemple de cette de la de Django shell:Changement de votre formulaire
clean
méthode pour vous assurer que les deux valeurs sont présents avant de les comparer. Quelque chose comme ceci:Est-il possible de faire la helptext en aller sans écraser?
Vous pouvez remplacer le
__init__
méthode de la forme et de définirself.fields['username'].help_text = None
. Un peu crufty à mon humble avis. Alternativement, vous pouvez utiliser une autre méthode pour afficher le formulaire où vous ignorer le texte d'aide.Quel est le KeyError? Je vais coller le stacktrace
stacktrace collé
OriginalL'auteur Manoj Govindan
À partir de ma propre expérience, j'ai constaté que si vous voulez faire de la validation dans de multiples domaines, même s'ils sont marqués comme required=True, lorsque vous remplacez la
clean()
méthode dans votre formulaire, si les champs que vous souhaitez valider ne sont pas remplis lors de la soumission et vous essayez d'accéder à un commecleaned_data["field_name"]
votre code va exploser avec unKeyError
. Pour éviter cela, il suffit d'accéder au champ dans cleaned_data par le biais de laget()
dictionnaire de la méthode et de vérifier si le fait pas, ou passer une valeur par défaut. Comme un corollaire:J'espère que cela aide quelqu'un d'autre, j'ai perdu une grande quantité de temps à cause de cette stupide chose!
OriginalL'auteur Caumons