为什么我们在 Django 视图中使用 form.save(commit=False)?

Abh*_*mar 1 django django-views

我无法理解我们使用form.save(commit=False)而不是简单地使用form.savein 的原因Django-views。有人可以向我解释两者的区别和必要性吗?

Ben*_*yer 5

form.save(commit=False)如果您正在使用 ModelForm,则主要使用。主要用例是如果您的 ModelForm 不包含模型的所有必需字段。

您需要将此表单保存在数据库中,但由于您没有提供所有必填字段,您将收到错误消息。

因此,解决方案是使用 commit=False 保存表单,然后您可以手动定义所需的值,然后调用常规保存。

主要区别是 commit=False 不会推送数据库中的更改,但它会创建它所需的所有结构,但您必须稍后触发常规保存,否则您的表单将不会保存在数据库中。

举个例子:

#create a Dog class with all fields as mandatory
class Dog(models.Model):
    name = models.CharField(max_length=50)
    race = models.CharField(max_length=50)
    age = models.PositiveIntegerField()

#create a modelForm with only name and age
class DogForm(forms.ModelForm):
    class Meta:
        model = Dog
        fields = ['name', 'age']

#in your view use this form
def dog_view(request):
    ...
    form = DogForm(request.POST or None)
    #if the form is valid we need to add a race otherwise we will get an error
    if form.is_valid():
        dog = form.save(commit=False)
        #define the race here
        dog.race = 'Labrador retriever'
        #and then do the regular save to push the change in the database
        dog.save()
        ...
Run Code Online (Sandbox Code Playgroud)

另一个例子是你想手动处理多对多关系的情况。

示例列表很长但很短,这是您需要在将模型保存到数据库之前执行中间步骤的时候。