JavaRush /Курси /Модуль 3: Django /Відмінності між Form та ModelForm

Відмінності між Form та ModelForm

Модуль 3: Django
Рівень 13 , Лекція 1
Відкрита

Отже, уявіть, що ви працюєте над застосунком, де користувачі мають заповнювати форму для запису даних у базу даних. Ви, сповнені ентузіазму, вручну створюєте Django Form і ретельно прописуєте валідацію полів. Все круто, але... вас відвідує тривожна думка: "Але ж у мене вже є модель, яка описує ці дані! Чому я маю все це робити вручну?" Тут на сцену виходить ModelForm, як супергерой для лінивих (або ефективних, як вам більше подобається) розробників.

Сьогодні ми поговоримо про те, як ModelForm кардинально спрощує створення форм, інтегрованих із моделями, і чим він відрізняється від звичайних Form.

Відмінності між Form і ModelForm

  1. Ключова різниця: контроль vs автоматизація
  • Form:
    Якщо ти використовуєш Form, то тобі потрібно вручну визначати, які поля будуть у формі, їхні властивості та поведінку. Це ідеально підходить, якщо форма не пов'язана напряму з базою даних. Наприклад, форма зворотного зв'язку, де користувач заповнює поле "Ім'я" і "Повідомлення" — сюди чудово підходить Form.

  • ModelForm:
    Коли тобі потрібно створити форму для роботи з даними з твоєї моделі (наприклад, додати або оновити запис у таблиці бази даних), ModelForm значно спрощує процес. Django сам "дивиться" на твою модель і автоматично генерує відповідні поля і навіть інтегрує валідацію!

Створення полів: вручну vs автоматично

Давайте порівняємо підходи: як виглядає створення форми в обох випадках.

Приклад: Form (ручний опис полів)

from django import forms

class ContactForm(forms.Form):
    name = forms.CharField(max_length=100, required=True)
    email = forms.EmailField(required=True)
    message = forms.CharField(widget=forms.Textarea, required=True)

Приклад: ModelForm (автоматична генерація полів)

from django.forms import ModelForm
from .models import Contact

class ContactForm(ModelForm):
    class Meta:
        model = Contact
        fields = ['name', 'email', 'message']

Як бачите, використовуючи ModelForm, ми просто посилаємося на модель, і форма створюється автоматично на основі її полів. Це суттєво зменшує кількість коду та знижує ймовірність помилок, особливо якщо ваша модель складна.

Валідація даних

  • Form:

    При використанні Form ви повинні вручну задавати правила валідації для кожного потрібного поля. Наприклад:

    def clean_email(self):
        email = self.cleaned_data['email']
        if "gmail.com" not in email:
            raise forms.ValidationError("Будь ласка, використовуйте Gmail-адресу.")
        return email
    
  • ModelForm:
    У ModelForm вже є вбудована валідація на основі вашої моделі. Наприклад, якщо у вашій моделі поле email має обмеження unique=True, то ModelForm автоматично перевірить унікальність значення при збереженні.

Приклад валідації з використанням моделі:

# models.py
from django.db import models

class Contact(models.Model):
    name = models.CharField(max_length=100)
    email = models.EmailField(unique=True)
    message = models.TextField()
# forms.py
from django.forms import ModelForm
from .models import Contact

class ContactForm(ModelForm):
    class Meta:
        model = Contact
        fields = ['name', 'email', 'message']

Тут ModelForm врахує обмеження унікальності для поля email, і вам не потрібно писати це вручну.

Метод save: ручне збереження vs автоматичне

  • Form:

    Якщо ти працюєш з Form, то після перевірки даних потрібно вручну створити об'єкт моделі і зберегти його в базу:

    if form.is_valid():
        data = form.cleaned_data
        contact = Contact.objects.create(
            name=data['name'],
            email=data['email'],
            message=data['message']
        )
    
  • ModelForm:

    З ModelForm це робиться простіше:
    if form.is_valid():
        form.save()
    

    Тут метод save() автоматично створює об'єкт моделі і зберігає його в базу даних.

Кастомізація

Одним із частих питань стає: наскільки гнучко можна кастомізувати поля чи поведінку форми?

  • Form:
    Оскільки всі поля створюються вручну, ви маєте повний контроль над кожним із них. Це гнучко, але вимагає більше зусиль.

  • ModelForm:

    Ви можете перевизначити будь-яке поле, додавши його до вашої форми. Наприклад:

    class ContactForm(ModelForm):
        class Meta:
            model = Contact
            fields = ['name', 'email', 'message']
    
        email = forms.EmailField(
            required=True,
            widget=forms.EmailInput(attrs={'placeholder': 'Введіть ваш email'})
        )

Де використовувати Form, а де ModelForm?

  • Використовуйте Form, коли:

    • Форма не пов'язана з моделлю.
    • Ви хочете повний контроль над кожним полем форми.
    • Форма використовується для обробки даних, які не зберігаються в базі (наприклад, форми зворотного зв'язку, пошуку і т.п.).
  • Використовуйте ModelForm, коли:

    • Форма безпосередньо пов'язана з моделлю.
    • Ви хочете мінімізувати код і автоматизувати валідацію та збереження даних.
    • Ви хочете уникнути дублювання коду між моделлю і формою.

Практичне завдання

Щоб закріпити різницю між Form та ModelForm, давайте зробимо наступне:

  1. Створіть модель Article з полями title, content та author:

    from django.db import models
    
    class Article(models.Model):
        title = models.CharField(max_length=200)
        content = models.TextField()
        author = models.CharField(max_length=100)
  2. Створіть дві форми в додатку:

    • Звичайна Form:

      from django import forms
      
      class ArticleForm(forms.Form):
          title = forms.CharField(max_length=200)
          content = forms.CharField(widget=forms.Textarea)
          author = forms.CharField(max_length=100)
    • ModelForm:

      from django.forms import ModelForm
      from .models import Article
      
      class ArticleModelForm(ModelForm):
          class Meta:
              model = Article
              fields = ['title', 'content', 'author']
  3. Спробуйте їх використовувати у view:

    from django.shortcuts import render
    from .forms import ArticleForm, ArticleModelForm
    
    def form_demo(request):
        if request.method == 'POST':
            # Використовуємо ModelForm
            form = ArticleModelForm(request.POST)
            if form.is_valid():
                form.save()  # Автоматичне збереження в базу
        else:
            # Використовуємо звичайну форму
            form = ArticleForm()
    
        return render(request, 'form_demo.html', {'form': form})
  4. Зверніть увагу, наскільки простіше та чистіше виглядає робота з ModelForm.

Таким чином, Form надає повний контроль, але вимагає більше ручної роботи, тоді як ModelForm ідеально підходить для роботи з моделями, автоматизуючи процес і заощаджуючи час. Тепер, коли ви знаєте, чим вони відрізняються, ви зможете обирати необхідний інструмент для ваших задач!

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ