使用Django开发简单表单遇KeyError与AttributeError报错
报错排查与修正方案
1. AttributeError 触发原因与修正
- 核心错误点:代码中抛出异常的语句存在两处疏漏
- 拼写错误:代码写的
forms.ValidatonError将ValidationError错拼为ValidatonError,少了字母i - 引用路径错误:代码顶部已经从
django.core.exceptions导入了ValidationError,不需要跨模块从django.forms下查找该类,django.forms本身就没有挂载这个异常类,因此触发module 'django.forms' has no attribute 'ValidatonError'报错
- 拼写错误:代码写的
- 修正方式:直接使用已经导入的
ValidationError类抛出异常即可。
2. clean方法中KeyError 触发原因与修正
- 核心错误点:Django表单的校验流程为「先逐字段执行单字段校验,校验通过的字段才会被写入
cleaned_data」,如果用户提交的内容未通过字段原生校验(比如name为空、email格式不合法),cleaned_data中不会存在对应的name、email键,此时直接用字典索引方式self.cleaned_data['name']取值,就会在第8、9行触发KeyError。 - 修正方式:使用字典的
get()方法安全取值,只有当字段值存在时,才执行后续的自定义校验逻辑。
修正后完整可运行代码
from django import forms from django.core.exceptions import NON_FIELD_ERRORS, ValidationError class StudentRegistration(forms.Form): name= forms.CharField() email= forms.EmailField() def clean(self): cleaned_data = super().clean() # 安全取值避免KeyError valname = cleaned_data.get('name') valemail = cleaned_data.get('email') # 仅当字段校验通过存在值时,执行自定义校验逻辑 if valname and len(valname) < 8: raise ValidationError('Name should be at least 8 characters long') if valemail and len(valemail) < 10: raise ValidationError('Please enter a valid email address')
额外提示:原代码存在逻辑与提示不匹配的问题:判断规则为「name长度小于8则报错」,但原提示文案写的是「长度需要大于等于4」,修正后的代码已经将提示与校验规则做了统一。
内容的提问来源于stack exchange,提问作者Kishan patel
相关产品推荐
相关产品推荐

