2017-01-31 10 views
1

У меня есть CreateView для ModelForm с методом form_valid(), который довольно рано вызывает form.save() (чтобы я мог получить идентификатор объекта), затем продолжает делать некоторые другие вещи (создавать некоторые связанные объекты , и отправьте несколько писем).Does form_valid в CreateView в django откатывает сохранение, если возникает ошибка?

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. Однако, когда это произошло, я не могу найти объекты в БД. У меня создалось впечатление, что form.save() должен создавать и сохранять объект в БД - это так или же он откатывает сохранение, если функция form_valid ошибочна в дальнейшем?

Я использую Django 1.8.17

PS: Да, я знаю, что я должен иметь электронную почту в отложенной задаче; которые будут реализованы позже.

ответ

2

Это зависит от настроек ATOMIC_REQUESTS. Установка в True вызовет поведение, описанное в docs:

Перед вызовом функции просмотра, Джанго начинает транзакцию. Если ответ создается без проблем, Django совершает транзакцию. Если представление создает исключение, Django возвращает транзакцию.