【问题标题】:How to update foreignkey field manually in UpdateView post method?如何在 UpdateView 发布方法中手动更新外键字段?
【发布时间】:2020-03-27 13:29:35
【问题描述】:

我正在尝试手动更改模型(支出)的外键字段(供应商)。我覆盖了 Expenditure 的 UpdateView post 方法,并在此方法中处理其他模型的表单。在这个视图中还呈现了一个新的SupplierForm,我正在跟踪这个表单是否通过表单的has_changed() 方法进行了更改。如果此表单已更改,我的要求是覆盖 ExpenditureFormrelated_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


    【解决方案1】:

    你可以重写表单的有效方法来手动添加东西,示例如下

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

    【讨论】:

    • 我知道这不是一个好习惯,但我将所有的业务逻辑都放在了这个方法中,并且更愿意把东西放在这里。我将如何仍然使用我用post() 编写的自定义验证,并根据这些更改form_valid() 的行为?
    猜你喜欢
    • 2020-02-25
    • 1970-01-01
    • 2013-08-22
    • 2012-02-02
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    相关资源
    最近更新 更多