Давайте почнемо з практики. Для початку створимо модель, на основі якої буде будуватися наша форма.
Крок 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']
Розберемося, що відбувається в коді:
- Наслідування від
forms.ModelForm: Це означає, що ми створюємо форму на основі моделі. - Клас
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 (рік заснування). На основі цієї моделі:
- Створіть відповідний
ModelForm. - Реалізуйте представлення для додавання нового видавництва.
- Налаштуйте шаблон для відображення форми.
Якщо ви зіткнетеся з труднощами, поверніться до викладеного вище прикладу. Впевнений, у вас все вийде!
Типові помилки при створенні ModelForm
- Помилка при вказуванні моделі в Meta. Завжди перевіряйте, щоб значення
modelвказувало на існуючу модель. - Плутанина з
fieldsтаexclude. Якщо задано і те, і інше, Django видасть помилку. Використовуйте тільки одне з них! - Не забувайте про CSRF-токен. Якщо не включити
{% csrf_token %}у форму, запити POST не будуть працювати.
Тепер ви знаєте, як створювати ModelForm та інтегрувати їх у свої застосунки! Це один із тих інструментів Django, який значно спрощує життя розробника. Попрактикуйтесь і спробуйте додати кастомізації — зазвичай це не тільки корисно, але й цікаво!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ