Форми Django. Форма проти форм. Модель


77

Хто-небудь може пояснити мені подібності та відмінності Django's forms.Form& forms.ModelForm?

Відповіді:


124

Форми, створені з 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 на звичайних поданнях, які не в адміністративній області? Форма може бути відтворена та оброблена в звичайних поданнях, коли ви передаєте request.POST для її ініціалізації.
Viet

1
Так. Це їх призначення за призначенням. Адмін-форми - це зовсім інший звір, який виходить за рамки цього питання. Звикніть посилатися на офіційну документацію. Це чудово, і це врятує вас майже кожен раз.
ятанізм

13

Подібність полягає в тому, що вони обидва генерують набори входів форми за допомогою віджетів, і обидва перевіряють дані, надіслані браузером. Відмінності полягають у тому, що ModelForm отримує визначення поля із зазначеного класу моделі, а також має методи, що стосуються збереження базової моделі до бази даних.


8

Ось як я розширюю вбудований 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')
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.