Примечания к выпуску 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 теперь поддерживает указание следующих атрибутов для настройки отображения формы:
BaseRenderer.bound_field_classна уровне проекта,Form.bound_field_classна уровне формы, иField.bound_field_classна полевом уровне.
Например, для настройки 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.admindocs¶
- Ссылки на компоненты в docstrings теперь поддерживают пользовательский текст ссылки в формате
:role:`link text <link>`. Более подробную информацию смотрите в разделе documentation helpers. - Параметры model pages теперь доступны только пользователям с соответствующими разрешениями на просмотр или изменение.
django.contrib.auth¶
- Количество итераций по умолчанию для PBKDF2passwordhasher увеличено с 870 000 до 1 000 000.
- Теперь доступны следующие новые асинхронные методы, использующие префикс
a:UserManager.acreate_user()UserManager.acreate_superuser()BaseUserManager.aget_by_natural_key()User.aget_user_permissions()User.aget_all_permissions()User.aget_group_permissions()User.ahas_perm()User.ahas_perms()User.ahas_module_perms()ModelBackend.aauthenticate()ModelBackend.aget_user_permissions()ModelBackend.aget_group_permissions()ModelBackend.aget_all_permissions()ModelBackend.ahas_perm()ModelBackend.ahas_module_perms()RemoteUserBackend.aauthenticate()RemoteUserBackend.aconfigure_user()
- Серверные системы аутентификации теперь могут предоставлять асинхронные реализации, которые используются при вызове функций асинхронной аутентификации (например,
aauthenticate()) для уменьшения переключения контекста, что повышает производительность. Более подробную информацию смотрите в adding an async interface. - В password validator classes теперь есть новый метод
get_error_message(), который можно переопределить в подклассах для настройки сообщений об ошибках.
django.contrib.gis¶
- GDAL теперь поддерживает криволинейную геометрию
CurvePolygon,CompoundCurve,CircularString,MultiSurface, иMultiCurveс помощью нового свойстваOGRGeometry.has_curve, а также методовOGRGeometry.get_linear_geometry()иOGRGeometry.get_curve_geometry(). coveredbyиcoversпоиск теперь поддерживаются в MySQL.
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и во всех приложенных альтернативах типа MIMEtext/*.
Отчеты об ошибках¶
- Атрибут
SafeExceptionReporterFilter.hidden_settingsтеперь обрабатывает значения как конфиденциальные, если их имя содержитAUTH.
Формы¶
- Новый виджет формы
ColorInputпредназначен для ввода цвета в шестнадцатеричном форматеrrggbbи отображается как<input type="color" ...>. Некоторые браузеры поддерживают визуальный интерфейс выбора цвета для этого типа ввода. - Новый виджет формы
SearchInputпредназначен для ввода поисковых запросов и отображается как<input type="search" ...>. - Новый виджет формы
TelInputпредназначен для ввода телефонных номеров и отображается в виде<input type="tel" ...>. - Новый аргумент
field_idдляErrorListпозволяет добавить атрибут HTMLidв шаблон ошибки. Подробнее см.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, если это необходимо для устаревших баз данных.
Разное¶
- Добавление
EmailMultiAlternatives.alternativesтеперь поддерживается только с помощью методаattach_alternative(). - Минимальная поддерживаемая версия
gettextувеличена с 0,15 до 0,19. HttpRequest.accepted_typesтеперь сортируется по предпочтениям клиента на основе заголовка запросаAccept.- Атрибуты
UniqueConstraint.violation_error_codeиUniqueConstraint.violation_error_messageтеперь используются всегда, если они указаны. Ранее они игнорировались, еслиUniqueConstraint.fieldsбыл задан безUniqueConstraint.condition. - Контекстный процессор
debug()больше не включен в шаблон проекта по умолчанию. - Для следующих методов теперь установлен
alters_data=True, чтобы предотвратить побочные эффекты при rendering a template context:UserManager.create_user()UserManager.acreate_user()UserManager.create_superuser()UserManager.acreate_superuser()QuerySet.create()QuerySet.acreate()QuerySet.bulk_create()QuerySet.abulk_create()QuerySet.get_or_create()QuerySet.aget_or_create()QuerySet.update_or_create()QuerySet.aupdate_or_create()
- Минимальная поддерживаемая версия
oracledbувеличена с 1.3.2 до 2.3.0. - Встроенные агрегатные функции, принимающие только один аргумент (
Avg,Count,Max,Min,StdDev,Sum, иVariance), теперь вызываютTypeErrorпри вызове с неправильным количеством аргументов.
Функции, устаревшие в версии 5.2¶
Разное¶
- Аргумент
allдля функцииdjango.contrib.staticfiles.finders.find()считается устаревшим в пользу аргументаfind_all. - Резервный вариант для
request.user, когдаuserявляетсяNoneвdjango.contrib.auth.login()иdjango.contrib.auth.alogin(), будет удален. - Аргумент
orderingключевого слова для функций агрегации, специфичных для PostgreSQLdjango.contrib.postgres.aggregates.ArrayAgg,django.contrib.postgres.aggregates.JSONBAgg, иdjango.contrib.postgres.aggregates.StringAgg, устарел в пользу аргументаorder_by.