Каковы различия между этими двумя способами сохранения информации о форме? - PullRequest
0 голосов
/ 11 марта 2019

Я учусь использовать формы django, и мне были представлены два способа сохранения информации из формы.Я проверил оба, и оба работают с валидациями, но я не понимал разницу между одним и другим.

Первый использует функции, унаследованные от класса models.Model, используя функцию "objects.create (*)* form.cleaned_data) "и передавая поля формы в качестве параметра.

В приведенном ниже примере я создаю экземпляр класса ProductForm, который наследуется от форм Form.ModelForm, и использую функцию cleaned_data для передачи в качествепараметр.

def product_create_view(request):

    form = ProductForm()

    if request.method == 'POST':
        form = ProductForm(request.POST or None)

        if form.is_valid():
            **Product.objects.create(**form.cleaned_data)**
            form = ProductForm()

    data = {}
    data['form'] = form

    return render(request, 'products/product_create.html', data)

Второй способ вместо использования функции objects.create (** dict) напрямую использует form.save ().

def product_create_view(request):

    form = ProductForm()

    if request.method == 'POST':
        form = ProductForm(request.POST or None)

        if form.is_valid():
            **form.save()**
            form = ProductForm()

    data = {}
    data['form'] = form

    return render(request, 'products/product_create.html', data)

Мне бы хотелосьзнать, что существуют различия между использованием form.save () и Product.objects.create (** dict)

1 Ответ

1 голос
/ 11 марта 2019

Вы можете позвонить только form.save() на ModelForm. В общем, это самый простой способ создания и обновления модели. Обратите внимание, что form.save() в этом случае возвращает сохраненный экземпляр, так что вы можете написать product = form.save() и делать больше с сохраненным product.

Если вы создадите форму, которая подклассирует класс Form, то она не будет связана с конкретной моделью и вы не сможете ее сохранить. Вы должны построить свою модель из параметров cleaned_data формы. Вы бы определили все поля вашей формы вручную, чтобы имитировать модель, что более трудоемко, чем для ModelForm, где вы можете просто дать fields список полей вашей модели.

Нет никакой разницы в конечном результате, но обычно ModelForm и использование form.save() является предпочтительным способом, так как он более читабелен и понятен, что вы делаете.

...