我对这个代码有问题:
PhoneNumberFormSet = inlineformset_factory(Person, PhoneNumber, fields=('phone_number',),
can_delete=False, extra=1)
EmailAddressFormSet = inlineformset_factory(Person, EmailAddress, fields=('email_address',),
can_delete=False, extra=1)
class PersonCreateView(CreateView):
form_class = PersonForm
success_url = reverse_lazy('person-list')
template_name = 'contacts/person_create.html'
def get_context_data(self, **kwargs):
data = super(PersonCreateView, self).get_context_data(**kwargs)
data['phone_formset'] = PhoneNumberFormSet(self.request.POST or None)
data['email_formset'] = EmailAddressFormSet(self.request.POST or None)
return data
def form_valid(self, form):
context = self.get_context_data()
phone_formset = context['phone_formset']
email_formset = context['email_formset']
with transaction.atomic():
o = form.save() # <--- this object is saved even when formsets below are not valid
condition = phone_formset.is_valid() and email_formset.is_valid()
if not condition:
return render(self.request, self.template_name, self.get_context_data())
phone_formset.instance = o
phone_formset.save()
email_formset.instance = o
email_formset.save()
return super(PersonCreateView, self).form_valid(form)
transaction.atomic()正在保存对象“o”,即使phone\u formset或email\u formset无效并且view呈现有错误的表单(不应保存对象)