【问题标题】:can we use modelform to update an existing instance of a model?我们可以使用 modelform 来更新模型的现有实例吗?
【发布时间】:2019-05-17 00:40:13
【问题描述】:

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

【问题讨论】:

  • instance=existing_instance 传递给模型表单?

标签: python django django-forms


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    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

    【讨论】:

    • 是不是意味着我首先要检查实例是否存在,然后再渲染表单?
    • @Gagan 没错,如果你真的想更新,首先你必须得到你想要的项目,然后updatesave() method
    【解决方案3】:

    是的,这在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 中的数据进行更新,并在数据库中进行更新。

    【讨论】:

    • 当我重新渲染表单时,它不会用当前值填充其字段
    • @Gagan:你能分享一下呈现要编辑的表单的视图吗?
    猜你喜欢
    • 2018-05-23
    • 1970-01-01
    • 2020-09-13
    • 2011-08-07
    • 1970-01-01
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多