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

Gag*_*gan 6 python django django-forms

我知道 django 中的 modelform 是一种用于生成模型实例的表单,但是假设如果我们想通过 modelform 更新已经存在的模型实例,那么它会更新模型还是创建一个全新的实例。

R. *_*cía 5

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()
Run Code Online (Sandbox Code Playgroud)

另一方面,您也可以指定是否要创建新实例...

仅当您使用 save(commit=False) 时才需要调用 save_m2m()。当您在表单上使用简单的 save() 时,所有数据(包括多对多数据)都将被保存,无需任何额外的方法调用。

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


Wil*_*sem 5

是的,这在[Django-doc] 的文档ModelForm中进行了解释:

# Creating a form to change an existing article.
>>> article = Article.objects.get(pk=1)
>>> form = ArticleForm(instance=article)
Run Code Online (Sandbox Code Playgroud)

因此,我们可以创建一个表单并传递一个已经存在的实例,例如:

MyModelForm(instance=my_modelinstance)
Run Code Online (Sandbox Code Playgroud)

如果渲染该表单,它将包含 initally 的值instance

我们还可以使用表单来更新模型,例如:

my_form = MyModelForm(request.POST, instance=my_modelinstance)
Run Code Online (Sandbox Code Playgroud)

如果我们随后执行my_form.save()my_modelinstance将会使用 中的数据进行更新request.POST,并在数据库中更新。


and*_*ari 3

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

\n\n

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

\n