【问题标题】:Difference between Django ModelForm and Model instance save methodsDjango ModelForm 和 Model 实例保存方法的区别
【发布时间】:2012-12-20 12:57:14
【问题描述】:

我试图了解 Django 的 ModelForm 保存方法和直接保存 Model 实例之间的区别。

就个人而言,我发现直接保存更直观,更清楚地显示数据何时保存。另外,如果我需要在保存之前修改实例,那么我必须使用模型保存方法,因为 Django 文档解释了here

那么,一旦表单被验证,有什么区别呢?如果表单使用多个模型或其他更复杂的用例,会有区别吗?

如果这很重要,我正在使用 Django 版本 1.4。下面是一些代码,展示了我如何倾向于保存经过验证的表单数据。

提前致谢!

# models.py
class Project(models.Model):
    project_name = models.CharField(unique=True, null=False, blank=False)

# views.py
def add_project(request):
    if request.method == 'POST':
        project = Project()
        form = ProjectForm(request.POST, instance=project)

        if form.is_valid():
            project.save() ### <-- project.save() vs form.save() ###

            return HttpResponseRedirect(reverse('view_project', args=(project.id,)))
    else:
        form = ProjectForm()

    return render_to_response(
        'add_project.html',
        {
            'form': form,
        },
        context_instance=RequestContext(request)
    )

# forms.py
class ProjectForm(ModelForm):
    class Meta:
        model = Project

【问题讨论】:

    标签: python django modelform django-forms


    【解决方案1】:

    在您的注释行中,project.save() 根本不会做任何事情。该实例尚未使用表单数据更新,它只是您之前创建的两行空实例。更新现有实例的唯一方法是保存其表单。

    【讨论】:

    • 嗨丹尼尔,项目实例在form = ProjectForm(request.POST, instance=project)更新
    • 不,不是。它可能会被更新为调用form.is_valid() 的副作用(查看源代码,调用ModelForm._post_save(),而后者又调用construct_instance()),但这并不能完全更新,不应依赖之上。你应该打电话给form.save()
    • +1 - 不要依赖无证行为,你以后会自找麻烦。
    • 嗯,如果我在form.is_valid() 之前打印project.project_name,则打印用户输入的数据。调试,更新似乎发生在BaseModelForm。但是,经过多次测试,我发现了一个没有发生这种情况的实例……尽管我从未在生产中看到过这种情况。我同意布莱尔,这是一场等待发生的意外。
    • 好吧,再测试一下,他们用户输入的 project_name 只有当我在 print 语句上有断点时才会打印出来。否则,不会打印任何内容。不知道为什么会这样,但这是一个不同的问题。谢谢大家!
    【解决方案2】:

    ModelForm.save() 返回从放入表单的数据中保存的对象,Model.save() 从初始化对象的数据或创建后设置的值返回一个对象。因此,当从用户在表单上输入的内容中获取数据到持久对象时,调用ModelForm.save() 比自己验证数据、初始化对象然后保存它更有意义,因为所有这些工作都由ModelForm 处理。

    【讨论】:

      猜你喜欢
      • 2012-08-31
      • 2010-10-23
      • 2020-01-02
      • 2013-06-12
      • 1970-01-01
      • 2012-08-13
      • 1970-01-01
      • 2015-04-17
      相关资源
      最近更新 更多