Я пытаюсь вручную изменить поле внешнего ключа (Поставщик) модели (Расходы). Я переопределяю метод UpdateView
post Расхода и обрабатываю формы для других моделей в этом методе. В этом представлении также отображается новый SupplierForm
, и я отслеживаю изменение этой формы с помощью метода has_changed()
формы. Если эта форма изменилась, то я прошу переопределить поле related_supplier
поля ExpenditureForm
и выбрать вновь созданный 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
Я переопределяю метод post с помощью super()
, поэтому, хотя я явно указываю метод save()
для всех связанных форм, однако я не вызываю метод save основной модели (Расходы), поскольку он уже обрабатывается после super()
. Вот как выглядит начало и конец моего метода:
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()
он возвращается к исходному объекту поставщика.