表单验证语法 - 调用form.save()与foo.save()

时间:2014-04-28 20:53:47

标签: django django-forms

我正在处理一个ModelForm,这两个似乎都返回相同的结果:

if request.method == 'POST':
    form = FooForm(request.POST)
    if form.is_valid():
        bar = form.save(commit = False)
        bar.user = request.user
        form.save()


if request.method == 'POST':
    form = FooForm(request.POST)
    if form.is_valid():
        bar = form.save(commit = False)
        bar.user = request.user         
        bar.save()               # calling save on bar instead of on the form

就如何保存数据和数据之间的关系而言,这两者有何不同?当我需要使用bar.save_m2m()时,第二种方法似乎不起作用,这让我觉得第一种方法是正确的方法。但是,第二种方法的逻辑对我来说更有意义。任何人都可以为我澄清哪一个更正确,为什么?我担心我无意中错误地处理数据并设置我的应用程序以解决问题。

1 个答案:

答案 0 :(得分:1)

从Django的网站上,这可能会清除你应该做的事情:

# Create a form instance with POST data.
>>> f = AuthorForm(request.POST)

# Create, but don't save the new author instance.
>>> new_author = f.save(commit=False)

# Modify the author in some way.
>>> new_author.some_field = 'some_value'

# Save the new instance.
>>> new_author.save()

# Now, save the many-to-many data for the form.
>>> f.save_m2m()

来自https://docs.djangoproject.com/en/1.6/topics/forms/modelforms/

这是从Django 1.6.2的源代码中提取的:

if commit:
    # If we are committing, save the instance and the m2m data immediately.
    instance.save()
    save_m2m()
else:
    # We're not committing. Add a method to the form to allow deferred
    # saving of m2m data.
    form.save_m2m = save_m2m
return instance

这就是为什么如果在Ex1:form.save()之后调用bar.save_m2m(),一切都会好的,你将逐步执行一个普通的save()。 Base类每次都返回它的实例,所以如果你调用save()它会保存你从外面指向的同一个实例,并且你刚修改过(警告:你是否将它用作全局变量?)...和无论如何你不能确定这个方法能按你的预期工作多长时间,因为在文档中没有任何地方说调用form.save(commit = False)时返回的实例与调用form.save()时使用的实例相同下方。

据我所知,您想知道哪种方式可以避免将来出现问题...我的建议是:选择第二种方式!