如果发生错误,django中CreateView上的form_valid是否会回滚保存?

时间:2017-01-31 10:34:13

标签: django django-forms django-class-based-views

我有一个带有form_valid()方法的ModelForm的CreateView,它很早就调用了form.save()(这样我就可以获得对象的ID),然后继续做其他一些事情(创建一些相关的东西)对象,并发送一些电子邮件)。

def form_valid(self, form):
    context = self.get_context_data()
    preferences_formset = context['preferences_formset']
    if preferences_formset.is_valid():
        student = form.save()
        ...
        send_email_one()
        send_email_two()
        send_email_three()
        return HttpResponseRedirect(self.get_success_url())

我最近发现,在调用send_email_three的某些情况下,某些后续处理有一些错误导致未处理的异常。我可以从我的日志中看到正在调用send_email_one和send_email_two,并且send_email_three中发生异常。但是,当发生这种情况时,我无法在DB中找到对象。我的印象是form.save()应该在数据库中创建并保存对象 - 如果form_valid函数在以后出错,它是否会回滚保存?

我正在使用django 1.8.17

PS:是的,我知道我应该在延期任务中收到电子邮件;这将在以后实施。

2 个答案:

答案 0 :(得分:2)

这取决于ATOMIC_REQUESTS设置。将其设置为True将触发docs

中描述的行为
  

在调用视图函数之前,Django启动一个事务。如果生成的响应没有问题,Django会提交事务。如果视图产生异常,Django将回滚事务。

答案 1 :(得分:1)