Примечания к выпуску Django 5.2

April 2, 2025

Добро пожаловать в Django 5.2!

В этих примечаниях к выпуску описываются new features, а также некоторые backwards incompatible changes, о которых вам следует знать при обновлении с Django 5.1 или более ранних версий. У нас есть begun the deprecation process for some features.

См. руководство Как обновить Django до более новой версии, если вы обновляете существующий проект.

В этих примечаниях к выпуску описываются long-term support release, а также некоторые , о которых вам следует знать при обновлении с Django 5.1 или более ранних версий. У нас есть .

Совместимость с Python

Django 5.2 поддерживает Python 3.10, 3.11, 3.12 и 3.13. Мы настоятельно рекомендуем и официально поддерживаем только последнюю версию каждой серии.

Django 5.2 поддерживает Python 3.10, 3.11, 3.12 и 3.13. Мы настоятельно рекомендуем и официально поддерживаем только последнюю версию каждой серии.

Автоматический импорт моделей в shell

Автоматический импорт моделей в <<<0>> --verbosity >

$ python -Wall manage.py shell --verbosity=2
6 objects imported automatically, including:

  from django.contrib.admin.models import LogEntry
  from django.contrib.auth.models import Group, Permission, User
  from django.contrib.contenttypes.models import ContentType
  from django.contrib.sessions.models import Session
...\> py -Wall manage.py shell --verbosity=2
6 objects imported automatically, including:

  from django.contrib.admin.models import LogEntry
  from django.contrib.auth.models import Group, Permission, User
  from django.contrib.contenttypes.models import ContentType
  from django.contrib.sessions.models import Session

Это behavior can be customized для добавления или удаления автоматического импорта.

Составной первичный источник

:class:`django.db.models.CompositePrimaryKey`Составной первичный источник

pk``Составной ``CompositePrimaryKey первичный источник

from django.db import models


class Release(models.Model):
    pk = models.CompositePrimaryKey("version", "name")
    version = models.IntegerField()
    name = models.CharField(max_length=20)

:doc:`/topics/composite-primary-key`Составной первичный источник

:class:`~django.forms.BoundField`Составной первичный источник

До версии 5.2 переопределение Field.get_bound_field() было единственной возможностью использовать пользовательский BoundField. Django теперь поддерживает указание следующих атрибутов для настройки отображения формы:

Например, для настройки BoundField класса Form:

from django import forms


class CustomBoundField(forms.BoundField):

    custom_class = "custom"

    def css_classes(self, extra_classes=None):
        result = super().css_classes(extra_classes)
        if self.custom_class not in result:
            result += f" {self.custom_class}"
        return result.strip()


class CustomForm(forms.Form):
    bound_field_class = CustomBoundField

    name = forms.CharField(
        label="Your Name",
        max_length=100,
        required=False,
        widget=forms.TextInput(attrs={"class": "name-input-class"}),
    )
    email = forms.EmailField(label="Your Email")

При рендеринге экземпляра CustomForm включается следующий HTML-код:

<div class="custom">
  <label for="id_name">Your Name:</label>
  <input type="text" name="name" class="name-input-class" maxlength="100" id="id_name">
</div>

<div class="custom">
  <label for="id_email">Your Email:</label>
  <input type="email" name="email" maxlength="320" required="" id="id_email">
</div>

Смотрите Настройка BoundField для получения более подробной информации об этой функции.

Незначительные особенности

django.contrib.admin

  • В шаблоне admin/base.html теперь есть новый блок extrabody для добавления пользовательского кода перед закрывающим тегом </body>.
  • Значение URLField теперь отображается в виде ссылки.

django.contrib.admindocs

  • Ссылки на компоненты в docstrings теперь поддерживают пользовательский текст ссылки в формате :role:`link text <link>`. Более подробную информацию смотрите в разделе documentation helpers.
  • Параметры model pages теперь доступны только пользователям с соответствующими разрешениями на просмотр или изменение.

django.contrib.auth

django.contrib.gis

django.contrib.syndication

  • Все классы SyndicationFeed теперь поддерживают атрибут stylesheets. Если он указан, инструкция по обработке <? xml-stylesheet ?> будет добавлена в начало документа для каждой таблицы стилей в данном списке. Смотрите Таблицы стилей подачи для получения более подробной информации.

Бэкенды баз данных

  • В соединениях MySQL теперь по умолчанию используется набор символов utf8mb4 вместо utf8, который является псевдонимом для устаревшего набора символов utf8mb3.
  • Серверные части Oracle теперь поддерживают connection pools, установив "pool" в OPTIONS части конфигурации вашей базы данных.

Декораторы

  • method_decorator() теперь поддерживается перенос асинхронных методов просмотра.

Електронна пошта

  • Элементы кортежей EmailMessage.attachments и EmailMultiAlternatives.attachments теперь называются кортежами, в отличие от обычных кортежей.
  • EmailMultiAlternatives.alternatives теперь это список именованных кортежей, в отличие от обычных кортежей.
  • Новый метод body_contains() возвращает логическое значение, указывающее, содержится ли предоставленный текст в электронном письме body и во всех приложенных альтернативах типа MIME text/*.

Отчеты об ошибках

Формы

  • Новый виджет формы ColorInput предназначен для ввода цвета в шестнадцатеричном формате rrggbb и отображается как <input type="color" ...>. Некоторые браузеры поддерживают визуальный интерфейс выбора цвета для этого типа ввода.
  • Новый виджет формы SearchInput предназначен для ввода поисковых запросов и отображается как <input type="search" ...>.
  • Новый виджет формы TelInput предназначен для ввода телефонных номеров и отображается в виде <input type="tel" ...>.
  • Новый аргумент field_id для ErrorList позволяет добавить атрибут HTML id в шаблон ошибки. Подробнее см. ErrorList.field_id.
  • К BoundField добавлено свойство aria_describedby, чтобы упростить использование этого HTML-атрибута в шаблонах.
  • Для улучшения доступности для пользователей программы чтения с экрана aria-describedby используется для привязки полей формы к сообщениям об ошибках. Подробнее см. how form errors are displayed.
  • Новый объект asset Script доступен для добавления пользовательских HTML-атрибутов в JavaScript в среде form media. Более подробную информацию смотрите в разделе paths as objects.

Команды управления

  • При запуске runserver отображается новое предупреждение, указывающее на то, что оно не подходит для рабочей среды. Это предупреждение можно отключить, установив для переменной окружения DJANGO_RUNSERVER_HIDE_WARNING значение "true".
  • Команды makemigrations и migrate имеют новый атрибут Command.autodetector для подклассов, который необходимо переопределить, чтобы использовать пользовательский класс автоопределения.
  • Новый метод BaseCommand.get_check_kwargs() может быть переопределен в пользовательских командах для управления выполнением системных проверок, например, для выбора проверок, зависящих от базы данных.

Миграции

  • Новая операция AlterConstraint - это нерабочая операция, которая изменяет ограничения без удаления и повторного создания ограничений в базе данных.

Модели

  • Предложение SELECT, сгенерированное при использовании QuerySet.values() и QuerySet.values_list(), теперь соответствует указанному порядку выражений, на которые даны ссылки. Ранее порядок был основан на наборе противоречащих интуиции правил, которые делали комбинацию запросов с помощью таких методов, как QuerySet.union() непредсказуемой.
  • Добавлена поддержка проверки ограничений модели, в которых используется GeneratedField.
  • Новый атрибут Expression.set_returning указывает, что выражение содержит функцию, возвращающую значение set, которая выполняет вычисление подзапроса. Это необходимо для многих функций, возвращающих значение set в Postgres.
  • CharField.max_length больше не требуется устанавливать в SQLite, который поддерживает неограниченное количество столбцов VARCHAR.
  • QuerySet.explain() теперь поддерживает параметры memory и serialize в PostgreSQL 17+.
  • Новая функция базы данных JSONArray принимает список имен полей или выражений и возвращает массив JSON, содержащий эти значения.
  • Новый атрибут Expression.allows_composite_expressions указывает, что выражение допускает использование составных выражений, например, для поддержки composite primary keys.

Запросы и ответы

  • Новое свойство HttpResponse.text предоставляет строковое представление HttpResponse.content.
  • Новый метод HttpRequest.get_preferred_type() можно использовать для запроса предпочтительного типа носителя, который принимает клиент.
  • Новый аргумент preserve_request для HttpResponseRedirect и HttpResponsePermanentRedirect определяет, будут ли использоваться коды состояния HTTP 302/307 или 301/308 соответственно.
  • Новый аргумент preserve_request для redirect() позволяет инструктировать пользовательский агент повторно использовать HTTP-метод и тело во время перенаправления, используя определенные коды состояния.

Сериализация

  • Каждый формат сериализации теперь определяет класс Deserializer, а не функцию, чтобы улучшить расширяемость при определении custom serialization format.

Шаблоны

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

Тесты

  • Фреймы стека из пользовательских утверждений Django теперь скрыты. Это упрощает считывание ошибок теста и позволяет test --pdb напрямую вводить метод проверки на сбой.
  • Данные, загруженные из fixtures и из миграций, включенных с помощью serialized_rollback=True, теперь доступны во время TransactionTestCase.setUpClass().

URLs

  • reverse() и reverse_lazy() теперь принимают аргументы query и fragment ключевых слов, что позволяет добавлять строку запроса и/или идентификатор фрагмента в сгенерированный URL-адрес соответственно.

Утилиты

  • SafeString теперь возвращает NotImplemented в __add__ для нестроковых значений с правой стороны. Это согласуется с поведением добавления str и позволяет использовать __radd__, если оно доступно.
  • format_html_join() теперь поддерживается использование итерационных отображений, передающих их содержимое в качестве аргументов ключевых слов в format_html().

Обратные несовместимые изменения в версии 5.2

API бэкенда базы данных

В этом разделе описаны изменения, которые могут потребоваться в бэкендах баз данных сторонних производителей.

  • Новый метод Model._is_pk_set() позволяет проверить, определен ли первичный ключ экземпляра модели.
  • BaseDatabaseOperations.adapt_decimalfield_value() теперь не требуется, просто возвращается заданное значение.

django.contrib.gis

  • Поддержка PostGIS 3.0 удалена.
  • Поддержка GDAL 3.0 удалена.

Прекращена поддержка PostgreSQL 13

Предварительная поддержка PostgreSQL 13 завершится в ноябре 2025 года. Django 5.2 поддерживает PostgreSQL 14 и выше.

Изменен набор символов для подключения к MySQL по умолчанию

Для подключений к MySQL теперь по умолчанию используется набор символов utf8mb4 вместо utf8, который является псевдонимом для устаревшего набора символов utf8mb3. utf8mb3 может быть указан в OPTIONS часть параметра DATABASES, если это необходимо для устаревших баз данных.

Разное

Функции, устаревшие в версии 5.2

Разное

  • Аргумент all для функции django.contrib.staticfiles.finders.find() считается устаревшим в пользу аргумента find_all.
  • Резервный вариант для request.user, когда user является None в django.contrib.auth.login() и django.contrib.auth.alogin(), будет удален.
  • Аргумент ordering ключевого слова для функций агрегации, специфичных для PostgreSQL django.contrib.postgres.aggregates.ArrayAgg, django.contrib.postgres.aggregates.JSONBAgg, и django.contrib.postgres.aggregates.StringAgg, устарел в пользу аргумента order_by.
Вернуться на верх