Может ли кто-нибудь объяснить мне сходства и различия Django forms.Form
и forms.ModelForm
?
Django forms.Form vs forms.ModelForm
Ответ 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')