向Django表单错误添加错误.__ all__

时间:2010-02-10 07:36:58

标签: django django-forms

清理数据后,如何在表单顶部添加错误?我有一个对象需要对外部应用程序(谷歌地图)进行REST调用作为预保存条件,这可能会失败,这意味着我需要我的用户更正表单中的数据。所以我清理数据,然后尝试保存并添加到表单错误,如果保存不起作用:

if request.method == "POST":
#clean form data
    try:
        profile.save()
        return HttpResponseRedirect(reverse("some_page", args=[some.args]))
    except ValueError:
        our_form.errors.__all__ = [u"error message goes here"]
return render_to_response(template_name, {"ourform": our_form,}, 
       context_instance=RequestContext(request))

这无法在我的单元测试中返回错误文本(在{{form.non_field_errors}}中查找它),然后当我通过调试器运行它时,错误没有添加到表单中当它们到达render_to_response行时,或者在our_form树中的任何其他位置,都会出现错误。为什么这不起作用?如何在清理表单后将错误添加到表单的顶部?

7 个答案:

答案 0 :(得分:18)

您确实希望在表单验证期间执行此操作并从那里引发ValidationError ...但如果您这样设置,则需要访问_errors以添加新邮件。尝试这样的事情:

from django.forms.util import ErrorList

our_form._errors["field_name"] = ErrorList([u"error message goes here"])

答案 1 :(得分:12)

可以使用常量NON_FIELD_ERRORS字典键(默认为__all__)添加非字段错误:

from django import forms
errors = my_form._errors.setdefault(forms.forms.NON_FIELD_ERRORS, forms.util.ErrorList())
errors.append("My error here")

答案 2 :(得分:10)

在Django 1.7或更高版本中,我会这样做:

form.add_error(field_name, "Some message")

方法add_error在1.7中添加。 form变量是我想要操作的表单,field_name是特定的字段名称,如果我想要一个与特定字段无关的错误,则None

在Django 1.6中我会做类似的事情:

from django.forms.forms import NON_FIELD_ERRORS

errors = form._errors.setdefault(field_name, form.error_class())
errors.append("Some message")

在上面的代码中,form是我想要操作的表单,field_name是我想要添加错误的字段名称。 field_name可以设置为NON_FIELD_ERRORS,以添加与特定字段无关的错误。我使用form.error_class()生成错误消息的空列表。这就是Django 1.6内部创建空列表而不是直接实例化ErrorList()的方式。

答案 3 :(得分:9)

你应该提出验证错误。

为什么不将验证放在表单的干净方法

class ProfileForm(forms.Form):
    def clean(self):
        try:
            #Make a call to the API and verify it works well
        except:
            raise forms.ValidationError('Your address is not locatable by Google Maps')

这样,您只需要在视图中使用标准form.is_valid()

答案 4 :(得分:9)

您的原始解决方案几乎就在那里。这是我构建的基本Form类,它允许我做同样的事情,即向表单添加非字段错误消息:

from django import forms
from django.forms.util import ErrorDict
from django.forms.forms import NON_FIELD_ERRORS 

class MyBaseForm(forms.Form):
    def add_form_error(self, message):
        if not self._errors:
            self._errors = ErrorDict()
        if not NON_FIELD_ERRORS in self._errors:
            self._errors[NON_FIELD_ERRORS] = self.error_class()
        self._errors[NON_FIELD_ERRORS].append(message)

class MyForm(MyBaseForm):
    ....

我的所有表单都扩展了这个类,因此我可以简单地调用add_form_error()方法来添加另一条错误消息。

答案 5 :(得分:1)

我不确定这是多么可怕的黑客攻击(直到这一点我才真正处理过两个Django项目)但如果你做了类似下面的事情,你会得到一个与之无关的单独错误消息模型中的特定字段:

form = NewPostForm()
if something_went_horribly_wrong():
  form.errors[''] = "You broke it!"

答案 6 :(得分:0)

如果验证属于数据层,那么您确实不应该使用表单验证。从Django 1.2开始,Django模型存在类似的概念,这肯定是你应该使用的。请参阅the documentation for model validation