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

hen*_*ski 15 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))
Run Code Online (Sandbox Code Playgroud)

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

Gab*_*ley 18

你真的想在表单验证期间执行此操作并从那里引发ValidationError ...但是如果你这样设置你就会想要访问_errors添加新消息.尝试这样的事情:

from django.forms.util import ErrorList

our_form._errors["field_name"] = ErrorList([u"error message goes here"])
Run Code Online (Sandbox Code Playgroud)

  • -1因为这不符合OP要求添加*非字段*错误的要求.同样-1,因为这个赋值会消除`_errors ["field_name"]`可能已经存在的任何错误. (6认同)

bmi*_*lac 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")
Run Code Online (Sandbox Code Playgroud)

  • 这导致'NoneType'对象对我没有属性'setdefault'.可能我的模型在其他方面是有效的,因此_errors未定义.有任何想法吗? (2认同)
  • @MartinProbst:调用form.is_valid()后必须运行此代码 (2认同)

Lou*_*uis 10

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

form.add_error(field_name, "Some message")
Run Code Online (Sandbox Code Playgroud)

该方法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")
Run Code Online (Sandbox Code Playgroud)

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


Lak*_*sad 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')
Run Code Online (Sandbox Code Playgroud)

这样,你只需要form.is_valid()视图中的标准.


hid*_*tao 8

您的原始解决方案几乎就在那里.这是我构建的基本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):
    ....
Run Code Online (Sandbox Code Playgroud)

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