Python 提交空字段会提示KeyError而不是ValidationError

Python 提交空字段会提示KeyError而不是ValidationError,python,django,Python,Django,原始问题:自定义表单验证错误的呈现方式与Django呈现的不同 参考下图,我很难从参考资料和Django的源代码中弄清楚,为什么我们自己提出的ValidationError(来自我们自己的清理/验证)呈现方式不同于表单(Django)本身呈现的ValidationError。Django引发的字段ValidationError呈现在“浮动气泡”中,而我引发的ValidationError呈现为红色文本 我用于引发ValidationErrors的方法与Django的文档一致,而我如何在模板中呈现

原始问题:自定义表单验证错误的呈现方式与Django呈现的不同

参考下图,我很难从参考资料和Django的源代码中弄清楚,为什么我们自己提出的ValidationError(来自我们自己的清理/验证)呈现方式不同于表单(Django)本身呈现的ValidationError。Django引发的字段ValidationError呈现在“浮动气泡”中,而我引发的ValidationError呈现为红色文本

我用于引发ValidationErrors的方法与Django的文档一致,而我如何在模板中呈现表单则只需调用
{{form}
由Django的模板引擎提供-虽然也使用了,但我已经验证了,除了将错误消息的样式设置为红色,而不是字段下的纯黑色粗体文本之外,它在这里没有任何效果

理想情况下,我想知道如何或应该做些什么,以便使所有ValidationError(Django的默认值和我自己的)统一显示,以防止表单中跨字段的设计不一致。最好是红色文本。非常感谢您对我的任何帮助

表单中错误的图像

形式
#示例
类AbstractUserForm(forms.ModelForm):
mail=forms.EmailField()
mobile=forms.CharField(
widget=forms.NumberInput,
必需=真
)
类元:
模型=用户
字段=['mail','mobile']
#验证电话号码
def清洁_移动式(自):
mobile=self.cleaned_数据['mobile']
如果len(移动式)<10或len(移动式)>11:
raise forms.ValidationError(“请输入有效的本地电话号码”)
返回手机
模板
{%load crispy_forms_tags%}
{%block content%}
{%csrf_令牌%}
使用者
{{form | crispy}}
{%endblock内容%}
模型
#示例
类LdapUser(ldapdb.models.Model):
#LDAP元数据
base\u dn=settings.LDAPUSER\u base\u dn
object_classes=['inetOrgPerson','person']
#人
username=fields.CharField(db\u column='cn',primary\u key=True)
given_name=fields.CharField(db_column='givenName')
user\u password=fields.CharField(null=True,db\u column='userPassword')
mobile=fields.CharField(db_column='mobile')
#伊内托格人
display\u name=fields.CharField(db\u column='displayName')
mail=fields.CharField(db_column='mail',unique=True)
更新 根据@abdul aziz barkat的澄清,我通过在表单标签中添加
novalidate
进行了一些测试。我注意到,在没有填写某些字段的情况下提交表单可以正常工作(
ValidationError
s提示为红色,可能是Django的默认验证),但不是专门针对我表单中的两个字段—
username
mail
。将这两个字段中的任何一个保留为空将导致
KeyError'required'
DEBUG=True

如图所示:

与其他字段相比,这两个字段唯一不同的是
username
具有
primary\u key=True
,而
mail
具有
unique=True
作为其在
模型中的参数。我的模型也是的一个扩展,但我不认为这与我的问题有任何关系

我自己也尝试过验证,但得到了类似的结果

#示例
类验证\u ldap\u必填\u字段()
def用户名(用户名):
如果用户名不是None:
真的
其他:
假的
def clean_用户名(自我):
username=self.cleaned_数据['username']
如果未验证\u字段。用户名(username):
raise forms.ValidationError(“此字段是必需的。”)
返回用户名
我还尝试在模型中添加
blank=False
作为它们的参数,也得到了类似的结果

键错误回溯
浮动冒泡中的这些错误不是由Django呈现的(自定义错误和Django的默认错误都会呈现为红色的错误),这是您的浏览器自己执行的验证。您可以通过在表单标记上添加
novalidate
属性来告诉浏览器不要执行此验证:

<form method="POST" novalidate>


浮动气泡中的这些错误不是由Django呈现的,Django是您的浏览器自己执行一些验证。您好,谢谢您的回复。我尝试了您的建议,在我的表单标签中添加了
novalidate
属性,但最终的结果是表单中根本没有出现
ValidationError
。相反,它在
DEBUG=True
中的/user/new/'required'
处引发了一个
key错误。除此之外,我确实看到在Chrome中呈现的“浮动气泡”
ValidationError
在Firefox中呈现时看起来确实不同。关于下一步的建议,Django真的没有自己的验证吗?因此,我需要像使用
mobile
一样清理我自己的所有表单字段?@IrfanHakim Django确实执行验证,请将您的观点和错误的完整堆栈跟踪添加到问题中。到目前为止,我已经对我的问题和我的一些发现做了更多的澄清。在此期间,我将尝试自己进一步调试。谢谢
<form method="POST" novalidate>