フォーム提出を処理するときに、カスタムロジック(連絡先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)
が十分ではありません。新しい車はまだ保存されています。何か案は?
いいえ。 'form_invalid'はフォーム処理中にエラーを処理します。それ以降は処理しません。実際には自分の 'form_valid()'メソッドの中で 'super()。form_invalid(form) 'を決して呼ぶべきではないことを理解しています(フォームが有効だったことを意味します) – chefarov