在Django中外部添加表单错误
我有一个Django表单,它将向数据库添加一个条目,其中一列上有一个唯一的约束。如果提交碰巧试图创建一个副本,我会得到一个在Django中外部添加表单错误,django,django-forms,Django,Django Forms,我有一个Django表单,它将向数据库添加一个条目,其中一列上有一个唯一的约束。如果提交碰巧试图创建一个副本,我会得到一个django.db.utls.IntegrityError声明我违反了唯一约束(谢天谢地) 在处理Django表单时,有多种验证方法: 重写表单类“clean方法 重写form类“clean方法 如果清除方法引发一个django.forms.ValidationError,则错误消息将附加到\u errors字典中字段名称下的列表中。使用clean方法时,应将错误写入\u e
django.db.utls.IntegrityError
声明我违反了唯一约束(谢天谢地)
在处理Django表单时,有多种验证方法:
clean
方法clean
方法清除
方法引发一个django.forms.ValidationError
,则错误消息将附加到\u errors
字典中字段名称下的列表中。使用clean
方法时,应将错误写入\u errors
目录
现在,clean
和clean
方法听起来不是放置有副作用的代码的好地方,我担心此时检查值是否唯一并不能保证我不会得到IntegrityError
s。我更愿意实际尝试在数据库中创建行,并在违反约束时发出表单错误信号
我的主要问题是表单公开了一个公共属性errors
,它是只读的。因此,根据文档,我应该在表单中添加一个完成所有工作的方法,尝试在数据库中插入,并在出现IntegrityError
时注册一个错误。因为验证后处理表单的操作需要大量其他数据,所以我不想将代码放在表单类本身中
是否有其他方法(记录或不记录)可以在类外的errors
dict中添加条目,或者我应该简单地访问\u errors
“private”变量并对此感到满意?我知道这听起来像是一个OOP漏洞,但是创建一个额外的方法来访问这个“private”变量在我看来并不能保护任何人不受任何影响
编辑:
似乎其他人已经提出了,但答案似乎指向手动插入
\u错误
..我认为将该方法添加到表单中是相当合理的。ModelForm类,它有一个save()方法,该方法执行将创建的实例保存到数据库的逻辑。如果您的表单可以从ModelForm继承(或者只是向表单中添加save()方法),那么您仍然符合“djangonian”标准
目前,一个简单的解决方案如下:
try:
# Try to save model instance, which might throw `IntegrityError`.
# ...
except django.db.utils.IntegrityError:
# The form passed validation so it has no errors.
# Use the `setdefault` function just in case.
errors = django.forms.util.ErrorList()
errors = form._errors.setdefault(
django.forms.forms.NON_FIELD_ERRORS, errors)
errors.append('Sorry, this username is already in use.')
我知道这是合理的,但在这种情况下我不能这样做。表单在不同的地方使用,在一种情况下,表单的数据通过多态调用传递给其他实体。在当前的设计中,表单不应该知道如何处理数据!可能重复的