Хто-небудь може пояснити мені подібності та відмінності Django's forms.Form
& forms.ModelForm
?
Відповіді:
Форми, створені з 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, ви можете використовувати a,
ModelForm
щоб уникнути дублювання опису вашої моделі.
Приклад форми моделі, створеної за допомогою forms.Modelform
:
from django.forms import ModelForm
from . import models
# Create the form class.
class ArticleForm(ModelForm):
class Meta:
model = models.Article
Ця форма автоматично має ті самі типи полів, що й Article
модель, з якої вона створена.
Подібність полягає в тому, що вони обидва генерують набори входів форми за допомогою віджетів, і обидва перевіряють дані, надіслані браузером. Відмінності полягають у тому, що ModelForm отримує визначення поля із зазначеного класу моделі, а також має методи, що стосуються збереження базової моделі до бази даних.
Ось як я розширюю вбудований 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')