【发布时间】:2022-01-26 05:35:16
【问题描述】:
【问题讨论】:
-
试试这个解决方案stack solution for key error
-
嘿,你要解决什么问题?
标签: django django-forms keyerror
【问题讨论】:
标签: django django-forms keyerror
美好的一天!
可能是模板 HTML 中有错误,<form> 中缺少 user_email 字段。
# form.py
from django import forms
from django.core import validators
class UserForm(forms.Form):
user_email = forms.EmailField()
user_vmail = forms.EmailField()
def clean(self):
all_data = super().clean()
print(all_data)
user_email = all_data["user_email"]
user_vmail = all_data["user_vmail"]
if user_email != user_vmail:
raise forms.ValidationError("Email does not match")
这给出了以下内容:
[26/Jan/2022 05:57:32] "GET / HTTP/1.1" 200 3702
{'user_email': 'asd@asd.asd', 'user_vmail': 'asd@asd.asd'}
[26/Jan/2022 05:57:43] "POST / HTTP/1.1" 302 0
[26/Jan/2022 05:57:43] "GET / HTTP/1.1" 200 3702
【讨论】:
有关更多信息,我强烈建议您查看文档,https://docs.djangoproject.com/en/4.0/ref/forms/validation/#form-field-default-cleaning
def clean(self):
cleaned_data = super().clean()
user_email= cleaned_data.get("user_email")
user_vmail = cleaned_data.get("user_vmail")
【讨论】:
试试这个
user_email = all_data.get('user_email')
user_vmail = all_data.get('user_vmail')
或者这个
user_email = self.all_data.get('user_email')
user_vmail = self.all_data.get('user_vmail')
第 1 次或第 2 次肯定会修复该关键错误
【讨论】:
all_data是局部变量,与self无关
由于您使用square 括号[] 表示keys,如果key 在您的all_data 中不存在,它将抛出KeyError
class user_form(forms.Form):
user_email = forms.EmailField()
user_vmail = forms.EmailField()
def clean(self):
all_data = super().clean()
user_email = all_data['user_email'] #<---- throws key error if 'user_email' not in all_data
user_vmail = all_data['user_vmail'] #<---- throws key error if 'user_vmail' not in all_data
if user_email != user_vmail:
raise forms.ValidationError("Email Doesn't match")
所以为了避免KeyError 检查key 是否存在于您的all_data 中
class user_form(forms.Form):
user_email = forms.EmailField()
user_vmail = forms.EmailField()
def clean(self):
all_data = super().clean()
if not ('user_email' in all_data.keys() and 'user_vmail' in all_data.keys()):
raise forms.ValidationError("Please fill all fields.")
user_email = all_data['user_email']
user_vmail = all_data['user_vmail']
if user_email != user_vmail:
raise forms.ValidationError("Email Doesn't match")
或者为了避免KeyError使用()作为
user_email = all_data('user_email')
user_vmail = all_data('user_vmail')
【讨论】: