我知道django中的modelform是用于生成模型实例的形式,但是假设如果我们要通过modelform更新已经存在的模型实例,那么它将更新模型还是创建一个全新的实例。 / p>
答案 0 :(得分:1)
ModelForm的子类可以接受现有的模型实例作为关键字参数实例;如果提供了此参数,则save()将更新该实例。如果未提供,则save()将创建指定模型的新实例。
来源:https://docs.djangoproject.com/en/2.1/topics/forms/modelforms/#the-save-method
答案 1 :(得分:1)
每个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
答案 2 :(得分:1)
是的,这在documentation on ModelForm
s [Django-doc]中有解释:
# Creating a form to change an existing article. >>> article = Article.objects.get(pk=1) >>> form = ArticleForm(instance=article)
所以我们可以创建一个表单并传递一个已经存在的实例,例如:
MyModelForm(instance=my_modelinstance)
如果您渲染该表格,它将最初包含instance
的值。
我们还可以使用表单来更新模型,例如:
my_form = MyModelForm(request.POST, instance=my_modelinstance)
如果我们随后执行my_form.save()
,则my_modelinstance
将使用request.POST
中的数据进行更新,并在数据库中进行更新。