清理数据后,如何在表单顶部添加错误?我有一个对象需要对外部应用程序(谷歌地图)进行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树中的任何其他位置,都会出现错误。为什么这不起作用?如何在清理表单后将错误添加到表单的顶部?
答案 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。