ValueError: save() 禁止以防止由于未保存的相关对象表单而导致数据丢失 - 创建表单 obj 为 fk



我尝试执行以下操作

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)

最新更新