在Django中外部添加表单错误

And*_*ron 6 django django-forms

我有一个Django表单,它将向一个数据库添加一个条目,其中一个列具有唯一约束.如果提交尝试创建重复,我得到一个django.db.utls.IntegrityError声明我违反了唯一约束(谢天谢地).

处理Django表单时,有许多方法可以验证:

  1. 覆盖表单类的clean方法
  2. 覆盖表单类的clean_<field>方法

如果clear_<field>方法引发a django.forms.ValidationError,则错误消息将附加到_errors字段名称下的字典中的列表中.使用该clean方法时,应将错误手动插入_errorsdict中.

现在,cleanclean_<field>方法听起来不是放置有副作用的代码的好地方,我担心此时检查值是否唯一并不能保证我不会得到IntegrityErrors.我宁愿尝试在数据库中创建行,并在违反约束时发出表单错误信号.

我的主要问题是,形式公开公共属性errors这是只读的.因此,根据文档,我应该在我的表单中添加一个完成所有工作的方法,尝试插入数据库并在IntegrityError引发时注册错误.因为验证后处理表单的操作需要大量其他数据,所以我不想将代码放在表单类本身中.

是否还有其他(有记录的或有记录的)方法可以errors在课堂外的dict中添加一个条目,或者我应该只是访问_errors"私有"变量并对此感到满意?我知道这听起来像是一个OOP漏洞,但创建一个额外的方法只是为了访问这个"私有"变量在我看来似乎并不像任何人屏蔽任何东西.

编辑: 似乎其他人已经提出了类似的问题,但似乎答案指向手动插入_errors...

And*_*ron 7

目前,一个简单的解决方案如下:

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.')
Run Code Online (Sandbox Code Playgroud)