Подтвердить что ты не робот

Django forms.Form vs forms.ModelForm

Может ли кто-нибудь объяснить мне сходства и различия Django forms.Form и forms.ModelForm?

4b9b3361

Ответ 1

Формы, созданные из forms.Form, настраиваются вручную вами. Вам лучше использовать их для форм, которые напрямую не взаимодействуют с моделями. Например, контактная форма или форма подписки на рассылку новостей, в которой вы не обязательно должны взаимодействовать с базой данных.

Если форма, созданная с помощью forms.ModelForm, будет автоматически создана, а затем может быть изменена вами. Лучшие примеры действительно из превосходной документации, представленной на веб-сайте Django.

forms.Form:
Документация: Объекты формы
Пример нормальной формы, созданной с помощью forms.Form:

from django import forms

class ContactForm(forms.Form):
    subject = forms.CharField(max_length=100)
    message = forms.CharField()
    sender = forms.EmailField()
    cc_myself = forms.BooleanField(required=False)

forms.ModelForm:
Документация: Создание форм из моделей
Прямо из документов:

Если ваша форма будет использоваться для напрямую добавить или отредактировать модель Django, вы можете использовать ModelForm, чтобы избежать дублируя описание модели.

Пример формы модели, созданной с помощью forms.ModelForm:

from django.forms import ModelForm
from . import models

# Create the form class.
class ArticleForm(ModelForm):
    class Meta:
        model = models.Article

Эта форма автоматически имеет все те же типы полей, что и модель Article, из которой она была создана.

Ответ 2

Сходство заключается в том, что они генерируют наборы входных данных формы с использованием виджетов, а также проверяют данные, отправленные браузером. Различия в том, что ModelForm получает свое определение поля из указанного класса модели, а также имеет методы, которые касаются сохранения базовой модели в базе данных.

Ответ 3

Вот как я расширяю встроенный UserCreationForm myapp/forms.py:

from django import forms
from django.contrib.auth.forms import UserCreationForm


class RegisterForm(UserCreationForm):

    first_name = forms.CharField(max_length=30)
    last_name = forms.CharField(max_length=30)
    email = forms.CharField(max_length=75)

    class Meta(UserCreationForm.Meta):
        fields = ('username','first_name','last_name', 'email')