2017-06-12 14 views
0

フォーム提出を処理するときに、カスタムロジック(連絡先Webサービスなど)を実行する必要があります。失敗した場合は、モデルカーの新しいインスタンスの作成を防止したいと思います。インスタンスを保存せずにCreateViewのform_valid()から返す

のは簡単なスニペットを通じて証明してみましょう:

from django.views import generic 
from django.http import HttpResponseRedirect 

class CarCreateView(generic.edit.CreateView): 
     model = Car 
     form_class = CarForm 

     def form_valid(self, form): 

      # some logic that may succeed or fail 

      if success: 
       messages.success(self.request, 'bla bla') 
       return super().form_valid(form) 
      else: 
       messages.error(self.request, 'blabla') 
       # How to return to form index without saving??? 
       return HttpResponseRedirect(self.get_success_url()) 

呼び出していないsuper().form_valid(form)が十分ではありません。新しい車はまだ保存されています。何か案は?

答えて

1

実際、私はいつも間違っていました。愚かな間違い。私は新しいインスタンスを保存したとき、実行は決してその時点に達しませんでした。同じ問題に探している人のために

、これを処理するクリーンな方法は

return self.render_to_response(self.get_context_data(form=form))のようです。

したがって、コードは次のようになります。

from django.views.generic import CreateView 
from django.http import HttpResponseRedirect 

class CarCreateView(CreateView): 
     model = Car 
     form_class = CarForm 

     def form_valid(self, form): 

      # some logic that may succeed or fail 

      if success: 
       messages.success(self.request, 'bla bla') 
       return super(CarCreateView, self).form_valid(form) 
      else: 
       messages.error(self.request, 'blabla') 
       return self.render_to_response(self.get_context_data(form=form)) 

我々は新しいインスタンスを作成せずに、同じフォームページを返すその方法を。

0
from django.views.generic import CreateView 
from django.http import HttpResponseRedirect 

class CarCreateView(CreateView): 
     model = Car 
     form_class = CarForm 

     def form_valid(self, form): 

      # some logic that may succeed or fail 

      if success: 
       messages.success(self.request, 'bla bla') 
       return super(CarCreateView, self).form_valid(form) 
      else: 
       messages.error(self.request, 'blabla') 
       return super(CarCreateView, self).form_invalid(form) 
+1

いいえ。 'form_invalid'はフォーム処理中にエラーを処理します。それ以降は処理しません。実際には自分の 'form_valid()'メソッドの中で 'super()。form_invalid(form) 'を決して呼ぶべきではないことを理解しています(フォームが有効だったことを意味します) – chefarov

関連する問題