可以使用modelform更新模型的现有实例吗?

时间:2018-12-16 11:46:58

标签: python django django-forms

我知道django中的modelform是用于生成模型实例的形式,但是假设如果我们要通过modelform更新已经存在的模型实例,那么它将更新模型还是创建一个全新的实例。 / p>

3 个答案:

答案 0 :(得分:1)

ModelForm的子类可以接受现有的模型实例作为关键字参数实例;如果提供了此参数,则save()将更新该实例。如果未提供,则save()将创建指定模型的新实例。

来源:https://docs.djangoproject.com/en/2.1/topics/forms/modelforms/#the-save-method

答案 1 :(得分:1)

save()方法

每个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 ModelForms [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中的数据进行更新,并在数据库中进行更新。