【发布时间】:2020-03-27 13:29:35
【问题描述】:
我正在尝试手动更改模型(支出)的外键字段(供应商)。我覆盖了 Expenditure 的 UpdateView post 方法,并在此方法中处理其他模型的表单。在这个视图中还呈现了一个新的SupplierForm,我正在跟踪这个表单是否通过表单的has_changed() 方法进行了更改。如果此表单已更改,我的要求是覆盖 ExpenditureForm 的 related_supplier 字段并通过以下语句选择新创建的 Supplier:
if supplier_form_changed:
new_supplier = related_supplier_form.save(commit=False)
new_supplier.save()
....
# This statement seems to have no effect
self.object.related_supplier = new_supplier
我用super()覆盖了post方法,所以即使我为所有相关表单明确声明save()方法,但是我不调用主模型(支出)的保存方法,因为它已经在@之后处理了987654331@。这就是我的方法的开始和结束的样子;
def post(self, request, *args, **kwargs):
context = request.POST
related_receipt_form = self.receipt_form_class(context, request.FILES)
related_supplier_form = self.supplier_form_class(context, request.FILES)
self.object = self.get_object()
related_receipt = self.object.receipt
related_supplier_form = self.supplier_form_class(context)
expenditure_form = self.form_class(context)
inlines = self.construct_inlines()
....
return super().post(self, request, *args, **kwargs)
您可以在此处找到我的整个视图的完整代码: https://paste.ubuntu.com/p/ZtCfMHSBZN/
所以我的问题是self.object.related_supplier = new_supplier 语句没有任何效果。更新后,旧的related_supplier 对象仍然存在,新的对象被保存但未附加到更新的Expenditure。奇怪的是,我在同一个视图中(也在 CreateView 中)做类似的事情,但没有任何问题。
我通过PyCharm调试了代码,在super()执行之前,我可以确认self.object.related_supplier是新创建的,但是当super()执行时,它又回到了原来的supplier对象。
【问题讨论】:
标签: django django-views django-class-based-views