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, который значительно упрощает жизнь разработчика. Попрактикуйтесь и попробуйте добавить кастомизации — обычно это не только полезно, но и интересно!

1
Задача
Модуль 3: Django, 13 уровень, 2 лекция
Недоступна
Создание ModelForm для модели
Создание ModelForm для модели
1
Задача
Модуль 3: Django, 13 уровень, 2 лекция
Недоступна
Использование ModelForm в представлении
Использование ModelForm в представлении
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ