【发布时间】:2017-01-13 11:11:35
【问题描述】:
我对 Django 基于类的表单保存表单的方式有疑问。我正在为我的一个模型使用form.ModelForm,它有一些多对多关系。
在模型的保存方法中,我检查其中一些关系的值以修改其他属性:
class MyModel(models.Model):
def save(self, *args, **kwargs):
if self.m2m_relationship.exists():
self.some_attribute = False
super(MyModel, self).save(*args, **kwargs)
即使我在表单中填充了 m2m 关系中的一些数据,我在保存模型时 self.m2m_relationship 并且令人惊讶的是它是一个空的 QuerySet。我最终发现了以下内容:
调用form.save()方法保存表单,属于BaseModelForm类。然后这个方法返回save_instance,forms\models.py中的一个函数。该函数定义了一个本地函数save_m2m(),它将多对多关系保存在一个表单中。
事情是这样的,看看save_instance在保存和实例和m2m时选择的顺序:
instance.save()
save_m2m()
显然问题就在这里。首先调用实例的save 方法,这就是为什么self.m2m_relationship 是一个空的QuerySet。它还不存在。
我能做些什么呢?我不能只更改 save_instance 函数中的顺序,因为它是 Django 的一部分,我可能会破坏其他内容。
【问题讨论】:
标签: python django python-2.7 django-1.4