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()
...
Еще один пример - случай, когда вы хотите иметь дело вручную со многими ко многим.
Список примеров длинный, но, чтобы быть коротким, это когда вам нужно сделать промежуточный шаг перед сохранением модели в базе данных.