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



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

就我个人而言,我觉得直接保存更直观,更清楚地显示何时保存数据。另外,如果我需要在保存之前修改实例,那么我必须使用Model保存方法,就像Django文档中解释的那样。

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

如果有关系的话,我使用的是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

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

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

最新更新