在is_valid()之后将django表单设置为错误

时间:2012-05-15 19:41:00

标签: django django-forms

我需要在使用is_valid()验证表单后调用API函数。此API调用仍然可以抛出异常,这反过来可能会使表单中的字段无效。

我该怎么做?我正在寻找类似的东西:

def smstrade(request):
    if request.method == "POST":
        form = SomeForm(request.POST)
        if form.is_valid():
            try:
                api_call(...)
            except SomeException:
                form["field"].set_valid(False)

4 个答案:

答案 0 :(得分:6)

迟到了,但您可以通过设置form._errors

使表单无效并添加显示相应的消息
>>> f.is_valid()
True
>>> f._errors['my_field'] = ['This field caused a problem']
>>> f.is_valid()
False
>>> str(f)
... <ul class="errorlist"><li>This field caused a problem</li></ul>

我需要使用FormView.form_valid()方法和具有唯一字段的模型

来执行此操作
def form_valid(self, form):
  obj = User(**form.cleaned_data)
  try:
    obj.save()
  except IntegrityError:
    form._errors['username'] = ['Sorry, already taken']
    return super(MyView, self).form_invalid(form)

  return super(MyView, self).form_valid(form)

答案 1 :(得分:3)

最好覆盖您感兴趣的字段的clean method并在那里添加逻辑。这样,您也可以输出相应的错误消息。

答案 2 :(得分:1)

听起来你只需要一个变量来存储表单对象之外的有效状态。

def smstrade(request):
    if request.method == "POST":
        form = SomeForm(request.POST)
        valid = form.is_valid()
        if valid:
            try:
                api_call(...)
            except SomeException:
                valid = False
        if valid: # still valid?
            print "VALID!"

但实际上你似乎应该把它放在表单中,这样你只需要调用is_valid()一次。唯一的复杂因素是您需要访问请求对象。

class MyForm(forms.Form):
    def clean(self):
        cd = super(MyForm, self).clean()
        try:
           api_call
        except Exception:
           raise forms.ValidationError("API Call failed")
        return cd

# view..
if form.is_valid():
     print "api call success and the rest of the form is valid too."

答案 3 :(得分:0)

如果您真的想通过调用is_valid来触发表单验证,那么这就是您可以这样做的方式(Django 1.4)

form = MyForm(data)
form.is_valid()
# ...
form._errors = None
form.is_valid() # trigger second validation