【发布时间】:2019-05-17 00:40:13
【问题描述】:
我知道 django 中的 modelform 是一种用于生成模型实例的表单,但是假设如果我们想通过 modelform 更新已经存在的模型实例,那么它会更新模型还是创建一个全新的实例。
【问题讨论】:
-
将
instance=existing_instance传递给模型表单?
标签: python django django-forms
我知道 django 中的 modelform 是一种用于生成模型实例的表单,但是假设如果我们想通过 modelform 更新已经存在的模型实例,那么它会更新模型还是创建一个全新的实例。
【问题讨论】:
instance=existing_instance 传递给模型表单?
标签: python django django-forms
ModelForm 的子类可以接受现有模型实例作为关键字参数实例;如果提供了这个, save() 将更新该实例。如果未提供,save() 将创建指定模型的新实例。
来源:https://docs.djangoproject.com/en/2.1/topics/forms/modelforms/#the-save-method
【讨论】:
每个 ModelForm 也有一个 save() 方法。此方法从绑定到表单的数据中创建并保存一个数据库对象。 ModelForm 的子类可以接受现有模型实例作为关键字参数实例;如果提供了这个, save() 将更新该实例。
如果未提供,save() 将创建指定模型的新实例:
>>> from myapp.models import Article
>>> from myapp.forms import ArticleForm
# Create a form instance from POST data.
>>> f = ArticleForm(request.POST)
# Save a new Article object from the form's data.
>>> new_article = f.save()
# Create a form to edit an existing Article, but use
# POST data to populate the form.
>>> a = Article.objects.get(pk=1)
>>> f = ArticleForm(request.POST, instance=a)
>>> f.save()
另一方面,您也可以指定是否要创建新实例...
仅当您使用 save(commit=False) 时才需要调用 save_m2m()。 当您在表单上使用简单的 save() 时,所有数据——包括 多对多数据——无需任何额外数据即可保存 方法调用。
来源:https://docs.djangoproject.com/en/2.1/topics/forms/modelforms/#the-save-method
【讨论】:
update 和save() method。
是的,这在documentation on ModelForms [Django-doc]中有解释:
# Creating a form to change an existing article. >>> article = Article.objects.get(pk=1) >>> form = ArticleForm(instance=article)
所以我们可以创建一个表单并传递一个已经存在的实例,例如:
MyModelForm(<b>instance=</b>my_modelinstance)
如果您渲染该表单,它将最初包含instance 的值。
我们也可以使用表单来更新模型,比如:
my_form = MyModelForm(request.POST, instance=my_modelinstance)
如果我们随后执行my_form.save(),则my_modelinstance 将使用request.POST 中的数据进行更新,并在数据库中进行更新。
【讨论】: