Давайте начнём с практики. Для начала создадим модель, на основе которой будет строиться наша форма.
Шаг 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, который значительно упрощает жизнь разработчика. Попрактикуйтесь и попробуйте добавить кастомизации — обычно это не только полезно, но и интересно!
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ