Почему мы используем form.save (commit = False) в Django-представлениях? - PullRequest
0 голосов
/ 24 апреля 2019

Я не могу понять причину, по которой мы используем form.save(commit=False) вместо простого использования form.save в Django-views. Может ли кто-нибудь объяснить мне разницу и необходимость в обоих?

1 Ответ

0 голосов
/ 24 апреля 2019

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()
        ...

Еще один пример - случай, когда вы хотите иметь дело вручную со многими ко многим.

Список примеров длинный, но, чтобы быть коротким, это когда вам нужно сделать промежуточный шаг перед сохранением модели в базе данных.

...