Django ModelForm:什么是保存(提交=假)用于?
为什么我会使用save(commit=False)
而不是仅仅从ModelForm
子类创build一个表单对象,并运行is_valid()
来validation表单和模型?
换句话说, save(commit=False)
是什么?
如果你不介意的话,你们能提供一些假设情况吗?
当从表单获取大部分模型数据时,这是非常有用的,但是需要用非表单数据填充一些null=False
字段。
用commit = False保存可以获得一个模型对象,然后你可以添加额外的数据并保存。
这是这种情况的一个很好的例子。
这里是答案( 来自文档 ):
# 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()
从Django文档:
这个save()方法接受一个可选的commit关键字参数,它接受True或False。 如果用commit = False调用save(),那么它将返回一个尚未保存到数据库的对象。
在这种情况下,由您决定在生成的模型实例上调用save()。 如果要在保存对象之前对对象执行自定义处理,或者如果要使用其中一个专用模型保存选项,则这很有用。 提交默认为True。
看来save(commit = False)确实会创build一个模型实例,并返回给你。 在实际保存之前,对于某些后期处理来说,这是完美的!
作为一个“真实的例子”,考虑一个用户模型,其中电子邮件地址和用户名总是相同的,然后你可以覆盖你的ModelForm的保存方法,如:
class UserForm(forms.ModelForm): ... def save(self): # Sets username to email before saving user = super(UserForm, self).save(commit=False) user.username = user.email user.save() return user
如果您没有使用commit=False
将用户名设置为电子邮件地址,则需要修改用户模型的保存方法,或者保存两次用户对象(这会重复执行昂贵的数据库操作)。