在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表单,它将向数据库添加一个条目,其中一列上有一个唯一的约束。如果提交碰巧试图创建一个副本,我会得到一个
django.db.utls.IntegrityError
声明我违反了唯一约束(谢天谢地)

在处理Django表单时,有多种验证方法:

  • 重写表单类“
    clean
    方法
  • 重写form类“
    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.')
    

    我知道这是合理的,但在这种情况下我不能这样做。表单在不同的地方使用,在一种情况下,表单的数据通过多态调用传递给其他实体。在当前的设计中,表单不应该知道如何处理数据!可能重复的