Гид по технологиям

Рендеринг форм в Django с django-crispy-forms

5 min read Django Обновлено 24 Nov 2025
Django: рендер форм с django-crispy-forms
Django: рендер форм с django-crispy-forms

Бумажная регистрационная форма, крупный план с полями и заголовком

О чём статья

Эта статья шаг за шагом показывает, как установить django-crispy-forms, настроить его и использовать для рендеринга регистрационной формы на основе встроенной формы UserCreationForm. Приведены примеры кода, чек-листы для ролей, критерии приёмки и рекомендации по безопасности и совместимости.

Что такое django-crispy-forms

django-crispy-forms — это библиотека для Django, которая предоставляет набор шаблонных тегов и фильтров для удобного рендеринга форм. Она генерирует HTML-структуру (обычно div-базированную), которую можно стилизовать под Bootstrap, Tailwind или другую CSS-систему.

Определение в одну строку: django-crispy-forms — инструмент для декларативного и переиспользуемого рендеринга форм в шаблонах Django.

Важно: библиотека сама по себе не заменяет валидацию Django. Она только управляет рендерингом и разметкой.

Преимущества

  • Меньше повторяющегося HTML-кода (DRY).
  • Быстрая интеграция с Bootstrap и Tailwind.
  • Удобные макеты и переиспользуемые layout-компоненты.
  • Поддержка стандартных форм Django (ModelForm, UserCreationForm и т. п.).

Как работает фильтр |crispy

Библиотека добавляет фильтр |crispy и тег {% crispy %}, которые преобразуют объект формы в HTML в соответствии с выбранным шаблоном-брэндом (например, bootstrap4). Вы контролируете внешний вид через настройки и кастомные layout-компоненты.

Установка

Создайте проект и приложение Django, затем установите django-crispy-forms. Пример с Pipenv:

pipenv install django-crispy-forms

Ожидаемый результат — пакет установлен в ваш виртуальный окружение. Ниже — пример того, как отображается успешная установка (скриншот):

Скриншот: успешная установка django-crispy-forms в окружение

Конфигурация в settings.py

Добавьте ‘crispy_forms’ в INSTALLED_APPS проекта, чтобы теги и фильтры стали доступны во всех приложениях:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'myapp',
    'crispy_forms',
]

# Необязательная настройка: выбор шаблонного пакета
CRISPY_TEMPLATE_PACK = 'bootstrap4'  # или 'bootstrap5', 'tailwind', и т.д.

CRISPY_TEMPLATE_PACK указывает, какие шаблоны отрисовки будут использоваться. Выберите пакет в соответствии с вашей CSS-библиотекой.

Создание формы (пример регистрации)

Мы используем встроенную форму UserCreationForm и модель User для регистрации новых пользователей.

Код формы (forms.py):

from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
from django.forms import ModelForm, TextInput, EmailInput, ImageField, Textarea

class RegisterUserForm(UserCreationForm):
    email = forms.EmailField(max_length=254, help_text='Required. Enter a valid email address.')

    class Meta:
        model = User
        fields = ('username', 'email', 'password1', 'password2')

Пояснение: UserCreationForm уже содержит логику проверки пароля. Мы добавляем поле email и указываем поля через Meta.

Представление (view)

Простейшая функция-представление, которая рендерит форму в шаблоне register.html:

from django.shortcuts import render
from django.http import HttpResponse, Http404
from .forms import RegisterUserForm
from django.contrib.auth.models import User

def register(request):
    form = RegisterUserForm()
    context = {'form': form}
    return render(request, 'register.html', context)

Важно: в примере выше форма создаётся для GET-запроса. Для полноценной регистрации нужно обрабатывать POST и сохранять пользователя после валидации — см. раздел «Мини-методология».

URL-маршрут

Пропишите маршрут для страницы регистрации в urls.py приложения:

from django.urls import path
from . import views

urlpatterns = [
    path('register', views.register, name='register'),
]

Рекомендуется использовать завершённый слеш в URL (например, ‘register/‘), чтобы соответствовать общим настройкам APPEND_SLASH.

Шаблон register.html

В шаблоне вы подключаете base.html (с Bootstrap) и загружаете теги crispy:

{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% block content %}
Register to be a member Are you a member? Login now
{% csrf_token %} {{ form|crispy }}
{% endblock %}

Здесь важны две вещи: тег {% csrf_token %} и фильтр |crispy, который превращает объект формы в разметку согласно CRISPY_TEMPLATE_PACK.

Форма регистрации в браузере, отображение на странице с полями и кнопкой Submit

Запуск и проверка

Запустите сервер Django и перейдите по адресу http://127.0.0.1:8000/register. Вы должны увидеть стилизованную форму с валидацией полей.

Если поля не отображаются как ожидается, проверьте:

  • CRISPY_TEMPLATE_PACK соответствует подключенному CSS (Bootstrap/Tailwind).
  • STATICFILES настроены и Bootstrap подключён в base.html.
  • ‘crispy_forms’ добавлен в INSTALLED_APPS.

Мини-методология: полноценная регистрация (шаги)

  1. Обработать POST в представлении: принимать данные, валидировать через form.is_valid().
  2. При успешной валидации сохранить форму: form.save().
  3. Выполнить вход пользователя автоматически (опционально) через django.contrib.auth.login.
  4. Перенаправить на страницу профиля или домашнюю страницу.

Пример обработки POST:

from django.shortcuts import render, redirect
from django.contrib.auth import login

def register(request):
    if request.method == 'POST':
        form = RegisterUserForm(request.POST)
        if form.is_valid():
            user = form.save()
            login(request, user)
            return redirect('home')
    else:
        form = RegisterUserForm()
    return render(request, 'register.html', {'form': form})

Чек-листы по ролям

  • Для разработчика:

    • Добавлен ‘crispy_forms’ в INSTALLED_APPS.
    • Установлен CRISPY_TEMPLATE_PACK, соответствующий CSS.
    • Обработаны POST-запросы и сохранение формы.
    • Тесты валидации написаны и проходят.
  • Для дизайнера:

    • Проверить соответствие классов Bootstrap/Tailwind.
    • Проверить отступы и визуальные состояния ошибок.
    • Убедиться, что фокус и aria-атрибуты доступны.
  • Для менеджера продукта:

    • Поля регистрации соответствуют требованиям (email, пароль, согласие).
    • Политика конфиденциальности доступна на форме.

Шпаргалка: часто используемые сниппеты

  • Подключение тегов в шаблоне:
{% load crispy_forms_tags %}
  • Рендер формы полностью:
{{ form|crispy }}
  • Использование layout в forms.py (пример):
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Submit, Layout, Field

class RegisterUserForm(UserCreationForm):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.layout = Layout(
            Field('username'),
            Field('email'),
            Field('password1'),
            Field('password2'),
            Submit('submit', 'Register')
        )

Помните: FormHelper и Layout позволяют детально контролировать разметку формы.

Критерии приёмки

  • Форма отображается на /register и видна пользователю.
  • При вводе некорректных данных пользователь видит понятные сообщения об ошибках.
  • При успешной регистрации создаётся объект User.
  • Пароли валидируются Django (минимальная безопасность, совпадение password1/password2).
  • UI соответствует выбранному шаблонному пакету (Bootstrap/Tailwind).

Тестовые сценарии (примеры)

  1. Попытка регистрации с пустым username — ожидается сообщение об ошибке.
  2. Попытка регистрации с уже существующим username — ожидается сообщение об ошибке о дублировании.
  3. Ввод двух разных паролей — ожидается сообщение о несовпадении.
  4. Успешная регистрация — пользователь создаётся, перенаправление на home.

Безопасность и соответствие

  • Всегда используйте {% csrf_token %} в шаблонах с формами POST.
  • Не храните пароли в открытом виде. Используйте встроенную систему аутентификации Django.
  • Для хранения личных данных (email и т. п.) продумайте политику хранения и удаления данных в соответствии с локальными законами о защите персональных данных (например, GDPR для пользователей ЕС).
  • Логирование ошибок не должно раскрывать персональные данные.

Примечание: реализация соответствия GDPR требует оценки процессов хранения, согласия пользователя и возможности удаления данных по запросу.

Совместимость и миграция

  • django-crispy-forms совместим с разными версиями Django, но перед апгрейдом проверьте официальную документацию на предмет поддерживаемых версий и изменения CRISPY_TEMPLATE_PACK.
  • При переходе между bootstrap4 и bootstrap5 проверьте классы и визуальные отличия в шаблонах.
  • Если вы используете Tailwind, убедитесь, что установлен соответствующий пакет шаблонов и что дерево классов не конфликтует с утилитами CSS.

Когда это может не подойти (ограничения)

  • Если вам нужен полностью кастомный HTML с нестандартной разметкой, возможно, удобнее писать шаблон вручную.
  • Для сильно динамичных форм с клиентской логикой (комплексные колбеки, динамические поля) может потребоваться дополнительный JS-код.

Глоссарий (1 строка)

  • CRISPY_TEMPLATE_PACK — настройка, определяющая набор шаблонов для рендеринга форм (например, bootstrap4).

Краткое резюме

django-crispy-forms ускоряет создание и поддержку форм в Django. Он упрощает верстку, сохраняет возможность использовать встроенную валидацию и интегрируется с популярными CSS-фреймворками. В большинстве приложений использование crispy-forms повышает читаемость кода и сокращает время разработки.

Важно: для полноценной регистрации реализуйте обработку POST, сохранение пользователя и запуск входа, а также протестируйте сценарии ошибок и соответствие требованиям безопасности.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Microsoft Store открывается сам — как исправить
Windows

Microsoft Store открывается сам — как исправить

Скачать и установить appx/appxbundle/msixbundle
Windows

Скачать и установить appx/appxbundle/msixbundle

Кнопка «Установить» в Microsoft Store не отображается
Windows

Кнопка «Установить» в Microsoft Store не отображается

Полноэкранный режим в Windows 10 — как включить
Windows

Полноэкранный режим в Windows 10 — как включить

Восстановление приложений на iPhone и iPad
Мобильные устройства

Восстановление приложений на iPhone и iPad

Как редактировать полученное письмо в Outlook
Outlook

Как редактировать полученное письмо в Outlook