JavaRush /Курси /Модуль 3: Django /Створення ModelForm на основі моделі

Створення ModelForm на основі моделі

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

Давайте почнемо з практики. Для початку створимо модель, на основі якої буде будуватися наша форма.

Крок 1: визначаємо модель

Припустимо, ми розробляємо сайт для управління бібліотекою. У нас є модель Book, яка описує книгу:

# models.py
from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=200)  # Назва книги
    author = models.CharField(max_length=100)  # Автор книги
    published_date = models.DateField()  # Дата публікації
    isbn = models.CharField(max_length=13, unique=True)  # ISBN номер
    description = models.TextField(blank=True, null=True)  # Опис книги

    def __str__(self):
        return self.title

Що тут відбувається?

  • Ми визначили модель Book, яка описує основні атрибути книги.
  • Поля (наприклад, title, author, isbn) автоматично будуть створювати структуру бази даних і тепер можуть бути використані для створення форми.

Крок 2: створюємо ModelForm

Тепер, коли наша модель готова, створимо форму на її основі:

# forms.py
from django import forms
from .models import Book

class BookForm(forms.ModelForm):
    class Meta:
        model = Book  # Вказуємо, на якій моделі базується форма
        fields = ['title', 'author', 'published_date', 'isbn', 'description']
        # Можна виключити деякі поля, якщо це необхідно:
        # exclude = ['description']

Розберемося, що відбувається в коді:

  1. Наслідування від forms.ModelForm: Це означає, що ми створюємо форму на основі моделі.
  2. Клас Meta: Тут ми вказуємо:
    • model — модель, на якій буде базуватися форма.
    • fields — список полів, які ми хочемо включити у форму.
    • Можна використовувати exclude замість fields, щоб виключити конкретні поля, якщо вам не потрібно включати їх у форму.

Крок 3: використовуємо форму у представленні

Тепер ми реалізуємо представлення, яке буде обробляти форму. Для цього можна використовувати Function-Based Views:

# views.py
from django.shortcuts import render, redirect
from .forms import BookForm

def add_book(request):
    if request.method == 'POST':
        form = BookForm(request.POST)
        if form.is_valid():  # Перевіряємо, чи форма валідна
            form.save()  # Зберігаємо дані в базу
            return redirect('book_list')  # Перенаправляємо на сторінку зі списком книг
    else:
        form = BookForm()
    return render(request, 'add_book.html', {'form': form})

Зверни увагу на ключові моменти:

  • Якщо метод запиту — POST, ми обробляємо дані форми, перевіряючи їх валідність через is_valid(). Якщо все правильно, зберігаємо дані методом save().
  • Якщо метод запиту — GET, ми просто створюємо порожню форму.

Крок 4: створюємо шаблон для форми

Тепер додамо HTML-шаблон, щоб користувач міг заповнити форму:

<!-- templates/add_book.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Додавання книги</title>
</head>
<body>
    <h1>Додати книгу</h1>
    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Додати</button>
    </form>
</body>
</html>

Що тут примітного:

  • {{ form.as_p }} — спеціальний синтаксис Django, який рендерить форму як HTML. Поля форми будуть оточені тегами <p>.

Налаштування полів форми через Meta

Іноді нам потрібно обмежити введення користувача або змінити відображення форми. Ми можемо налаштувати окремі поля через Meta.

class BookForm(forms.ModelForm):
    class Meta:
        model = Book
        fields = ['title', 'author', 'published_date', 'isbn', 'description']
        widgets = {
            'published_date': forms.DateInput(attrs={'type': 'date'}),
            'description': forms.Textarea(attrs={'rows': 4, 'cols': 40}),
        }
        labels = {
            'title': 'Назва книги',
            'author': 'Автор',
            'published_date': 'Дата публікації',
            'isbn': 'ISBN номер',
            'description': 'Опис',
        }
  • widgets — зміни відображення полів (наприклад, поле дати тепер буде рендеритися як input з типом date).
  • labels — налаштовує мітки полів.

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

Давайте додамо трохи інтерактиву. Спробуйте самостійно створити нову модель під назвою Publisher з атрибутами name (назва видавництва) та founded (рік заснування). На основі цієї моделі:

  1. Створіть відповідний ModelForm.
  2. Реалізуйте представлення для додавання нового видавництва.
  3. Налаштуйте шаблон для відображення форми.

Якщо ви зіткнетеся з труднощами, поверніться до викладеного вище прикладу. Впевнений, у вас все вийде!

Типові помилки при створенні ModelForm

  • Помилка при вказуванні моделі в Meta. Завжди перевіряйте, щоб значення model вказувало на існуючу модель.
  • Плутанина з fields та exclude. Якщо задано і те, і інше, Django видасть помилку. Використовуйте тільки одне з них!
  • Не забувайте про CSRF-токен. Якщо не включити {% csrf_token %} у форму, запити POST не будуть працювати.

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

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