Django ModelForm和Model实例保存方法之间的区别

时间:2013-01-06 18:03:25

标签: python django modelform django-forms

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

就个人而言,我发现直接保存更直观,更清晰地显示数据何时保存。另外,如果我需要在保存之前修改实例,那么我必须使用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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

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