【问题标题】:Return from CreateView's form_valid() without saving an instance从 CreateView 的 form_valid() 返回而不保存实例
【发布时间】:2017-06-12 18:41:44
【问题描述】:

在处理表单提交时,我必须执行自定义逻辑(联系网络服务等)。如果失败,我想阻止创建模型 Car 的新实例。

我们通过一个简单的sn-p来演示一下:

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) 是不够的。一辆新车仍在保存中。有什么想法吗?

【问题讨论】:

    标签: django django-generic-views


    【解决方案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))
    

    这样我们返回相同的表单页面,而无需创建新实例。

    【讨论】:

      【解决方案2】:
      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)
      

      【讨论】:

      • 不。 form_invalid 负责处理表单处理期间的错误,而不是在那之后。实际上,据我所知,永远不要在他的 form_valid() 方法中调用 super().form_invalid(form)(这意味着该表单是有效的)
      猜你喜欢
      • 1970-01-01
      • 2020-01-02
      • 1970-01-01
      • 2018-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-26
      • 2015-10-18
      相关资源
      最近更新 更多