我尝试执行以下操作
class CaseCreateView(BSModalCreateView):
template_name = 'orders/create_case_modal.html'
form_class = NewCaseModal
success_message = 'Success: Case was created.'
success_url = reverse_lazy('scan_to_cart')
def form_valid(self, form):
case_num = random_string_generator()
obj = form.save(commit=False)
obj.user = self.request.user
obj.case_number = case_num
mess_obj = MessageEntry.objects.create(user=obj.user, message_fk=obj, mess_obj=obj.initial_memo)
return super(CaseCreateView, self).form_valid(form)
这给了我以下错误。
ValueError: save() prohibited to prevent data loss due to unsaved related object 'message_fk'.
这是一个bootstrap_modal_forms窗口,我在其中保存表单。我想创建一个与 obj 表单挂钩的 FK 字段 (message_fk( 的对象。
在将 obj 分配给 message_fk 之前,我无法保存 obj,因为在这种情况下,表单会保存两次。(不知道为什么(
我以前从未使用过基于类的视图,并且找不到正确执行此操作的方法。
您首先需要保存obj
,因为您可以将MessageEntry
链接到它。如果未保存oj
,则不会将pk
分配给 id,因此无法将另一个对象链接到它。
在将 obj 分配给
message_fk
之前,我无法save()
obj,因为在这种情况下,表单会保存两次。
发生这种情况的原因是因为super(CaseCreateView, self).form_valid(form)
将保存表单。但是我们不需要在这里调用super(CaseCreateView, self).form_valid(form)
,我们可以做FormMixin.form_valid
方法[Django-doc]所做的:重定向到get_success_url()
结果[Django-doc]:
from django.views.generic.edit importFormMixin
class CaseCreateView(BSModalCreateView):
template_name = 'orders/create_case_modal.html'
form_class = NewCaseModal
success_message = 'Success: Case was created.'
success_url = reverse_lazy('scan_to_cart')
def form_valid(self, form):
case_num = random_string_generator()
self.object= obj = form.save(commit=False)
obj.user = self.request.user
obj.case_number = case_num
obj.save()
mess_obj = MessageEntry.objects.create(user=obj.user, message_fk=obj, mess_obj=obj.initial_memo)
returnFormMixin.form_valid(self, form)