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()1回だけ呼び出す必要があります。唯一の問題は、リクエストオブジェクトへのアクセスが必要な場合です。

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 に答える