You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.28 04:27:05