6

在使用 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

4 回答 4

8

有点晚了,但是您可以通过设置 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)
于 2013-05-01T03:54:37.960 回答
3

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

于 2012-05-15T20:09:00.317 回答
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."
于 2012-05-15T20:06:28.070 回答
0

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

form = MyForm(data)
form.is_valid()
# ...
form._errors = None
form.is_valid() # trigger second validation
于 2013-09-24T09:42:42.020 回答