Как обновить поле чужой клавиши вручную в методе постов UpdateView? - PullRequest
0 голосов
/ 27 марта 2020

Я пытаюсь вручную изменить поле внешнего ключа (Поставщик) модели (Расходы). Я переопределяю метод 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() он возвращается к исходному объекту поставщика.

1 Ответ

0 голосов
/ 27 марта 2020

вы можете переопределить метод, действительный для формы, чтобы добавить вещи вручную, пример показан ниже

   def form_valid(self, form):
        related_supplier_form.instance.related_supplier = new_supplier
        valid_data = super(UpdateView, self).form_valid(form)
        return valid_data
...