Примечания к выпуску Django 5.1¶
7 августа 2024 года
Добро пожаловать в Django 5.1!
В этих примечаниях к выпуску описываются new features, а также некоторые backwards incompatible changes, о которых вам следует знать при обновлении с Django 5.0 или более ранних версий. У нас есть begun the deprecation process for some features.
См. руководство Как обновить Django до более новой версии, если вы обновляете существующий проект.
Совместимость с Python¶
Django 5.1 поддерживает Python 3.10, 3.11, 3.12 и 3.13 (начиная с версии 5.1.3). Мы настоятельно рекомендуем и официально поддерживаем только последнюю версию каждой серии.
Что нового в Django 5.1¶
{% querystring %}
тег шаблона¶
В Django 5.1 введен тег шаблона {% querystring %}
, упрощающий изменение параметров запроса в URL-адресах и упрощающий создание ссылок, которые поддерживают существующие параметры запроса при добавлении или изменении определенных.
Например, разбивка навигации по страницам и строки запросов в шаблонах могут быть громоздкими. Рассмотрим этот фрагмент шаблона, который динамически генерирует URL-адрес для перехода к следующей странице в представлении с разбивкой на страницы:
{# Linebreaks added for readability, this should be one, long line. #}
<a href="?{% for key, values in request.GET.iterlists %}
{% if key != "page" %}
{% for value in values %}
{{ key }}={{ value }}&
{% endfor %}
{% endif %}
{% endfor %}page={{ page.next_page_number }}">Next page</a>
При переключении на использование этого нового тега шаблона вышеуказанное волшебным образом становится:
<a href="{% querystring page=page.next_page_number %}">Next page</a>
Пулы подключений PostgreSQL¶
В Django 5.1 также добавлена поддержка connection pool для PostgreSQL. Поскольку время установления нового соединения может быть относительно длительным, поддержание соединений открытыми может сократить задержку.
Чтобы использовать пул соединений с psycopg, вы можете установить параметр "pool"
внутри OPTIONS
в качестве параметра, который будет передаваться в ConnectionPool
, или в True
для используйте значения ConnectionPool
по умолчанию:
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql",
# ...
"OPTIONS": {
"pool": {
"min_size": 2,
"max_size": 4,
"timeout": 10,
}
},
},
}
Промежуточное программное обеспечение, требующее проверки подлинности по умолчанию¶
Новый LoginRequiredMiddleware
перенаправляет все запросы, не прошедшие проверку подлинности, на страницу входа в систему. Просмотры могут разрешить запросы, не прошедшие проверку подлинности, с помощью нового login_not_required()
декоратора.
LoginRequiredMiddleware
соответствует значениям login_url
и redirect_field_name
, заданным с помощью login_required()
декоратора, но не поддерживает установку login_url
или redirect_field_name
с помощью LoginRequiredMixin
.
Чтобы включить это, добавьте "django.contrib.auth.middleware.LoginRequiredMiddleware"
к вашим настройкам MIDDLEWARE
.
Незначительные особенности¶
django.contrib.admin
¶
ModelAdmin.list_display
теперь поддерживается использование__
запросов для отображения списка полей из связанных моделей.
django.contrib.auth
¶
- Количество итераций по умолчанию для PBKDF2passwordhasher увеличено с 720 000 до 870 000.
- Значение по умолчанию
parallelism
для параметраScryptPasswordHasher
увеличено с 1 до 5 в соответствии с рекомендациями OWASP. - Новый
AdminUserCreationForm
и существующийAdminPasswordChangeForm
теперь поддерживают отключение аутентификации на основе пароля путем установки непригодного для использования пароля при сохранении формы. Теперь это доступно в разделе администратора при посещении страниц создания пользователя и смены пароля. login_required()
,permission_required()
, иuser_passes_test()
декораторы теперь поддерживают перенос функций асинхронного просмотра.ReadOnlyPasswordHashWidget
теперь включает кнопку для сброса пароля пользователя, которая заменяет ссылку, ранее размещенную в тексте справкиReadOnlyPasswordHashField
, улучшая общую доступностьUserChangeForm
.
django.contrib.gis
¶
BoundingCircle
теперь поддерживается в SpatiaLite 5.1+.Collect
теперь поддерживается в MySQL 8.0.24+.GeoIP2
теперь позволяет выполнять запросы с использованием объектовipaddress.IPv4Address
илиipaddress.IPv6Address
.GeoIP2.country()
теперь отображаются значенияcontinent_code
,continent_name
, иis_in_european_union
.GeoIP2.city()
теперь отображаются значенияaccuracy_radius
иregion_name
. Кроме того, значенияdma_code
иregion
теперь отображаются какmetro_code
иregion_code
, но предыдущие ключи также сохраняются для обеспечения обратной совместимости.Area
теперь поддерживается модульha
.- Новый атрибут
OGRGeometry.is_3d
позволяет проверить, имеет ли геометрия координатный размерZ
. - Новый метод
OGRGeometry.set_3d()
позволяет добавлять и удалять координатное измерениеZ
. OGRGeometry
,Point
,LineString
,Polygon
, иGeometryCollection
и его подклассы теперь поддерживают измеренную геометрию с помощью новых свойствOGRGeometry.is_measured
иm
, а также методаOGRGeometry.set_measured()
.OGRGeometry.centroid
теперь доступно для всех поддерживаемых типов геометрии.- Функции
FromWKB()
иFromWKT()
теперь поддерживают необязательный аргументsrid
(за исключением Oracle, где он игнорируется).
django.contrib.postgres
¶
BTreeIndex
теперь поддерживается параметрdeduplicate_items
.
django.contrib.sessions
¶
django.contrib.sessions.backends.cached_db.SessionStore
теперь обрабатывает исключения при сохранении информации о сеансе в кэше, регистрируя соответствующие сообщения об ошибках с их обратной трассировкой через недавно добавленный sessions logger.django.contrib.sessions.backends.base.SessionBase
и все встроенные сессионные движки теперь предоставляют асинхронный API. Все новые асинхронные методы имеют имена с префиксомa
, напримерaget()
,akeys()
, илиacycle_key()
.
Бэкенды баз данных¶
"init_command"
опция теперь поддерживается вOPTIONS
на SQLite, что позволяет указывать pragma options для установки при подключении.- опция
"transaction_mode"
теперь поддерживается вOPTIONS
в SQLite, что позволяет указывать параметр Поведение транзакций. "pool"
опция теперь поддерживается вOPTIONS
в PostgreSQL, чтобы разрешить использование connection pools.
Отчеты об ошибках¶
- Чтобы улучшить доступность, страницы с техническими ошибками 404 и 500 теперь содержат элементы HTML-ориентира для верхнего и нижнего колонтитула и основного содержимого.
Хранение файлов¶
- Параметр
allow_overwrite
вFileSystemStorage
теперь позволяет сохранять новые файлы поверх существующих.
Формы¶
- Чтобы улучшить доступность и дать возможность читателям с экрана связывать наборы полей с их справочным текстом, набор полей формы теперь содержит атрибут
aria-describedby
HTML.
Команды управления¶
- Команда
makemigrations
теперь отображает значимые символы для каждой операции, чтобы выделитьoperation categories
.
Миграции¶
- Новый атрибут
Operation.category
позволяет указатьoperation category
, используемыйmakemigrations
для отображения значимого символа операции.
Модели¶
QuerySet.explain()
теперь поддерживается опцияgeneric_plan
в PostgreSQL 16+.RowRange
теперь принимает положительные целые числа в качестве аргументаstart
и отрицательные целые числа в качестве аргументаend
.- Новый
exclusion
аргументRowRange
иValueRange
позволяет исключить строки, группы и связи из оконных рам. QuerySet.order_by()
теперь поддерживается упорядочивание по преобразованиям аннотаций, таким какJSONObject
ключи иArrayAgg
индексы.F()
иOuterRef()
выражения, которые выводятCharField
,EmailField
,SlugField
,URLField
,TextField
, илиArrayField
, теперь могут быть sliced.- Новый
from_queryset
аргументовModel.refresh_from_db()
иModel.arefresh_from_db()
позволяет настроить набор запросов, используемый для перезагрузки значения модели. Это можно использовать для блокировки строки перед перезагрузкой или для выбора связанных объектов. - Новый атрибут
Expression.constraint_validation_compatible
позволяет указать, что выражение следует игнорировать во время проверки ограничения.
Шаблоны¶
- Пользовательские теги теперь могут устанавливать extradata для объекта
Parser
, который позже будет доступен в экземпляреTemplate
. Такие данные могут использоваться, например, загрузчиком шаблонов или другими клиентами шаблонов. - Template engines теперь реализуйте метод
check()
, который уже зарегистрирован в check framework.
Тесты¶
assertContains()
,assertNotContains()
, иassertInHTML()
утверждения теперь добавляют стога сена к сообщениям об ошибках утверждений.Классы
RequestFactory
,AsyncRequestFactory
,Client
, иAsyncClient
теперь поддерживают параметрquery_params
, который принимает словарь ключей и значений строки запроса. Это позволяет более легко настраивать строки запроса для любых HTTP-методов.self.client.post("/items/1", query_params={"action": "delete"}) await self.async_client.post("/items/1", query_params={"action": "delete"})
Новое утверждение
SimpleTestCase.assertNotInHTML()
позволяет проверить, что HTML-фрагмент не содержится в данном HTML-стоге сена.Чтобы обеспечить изоляцию тестов, подключения к базе данных внутри потоков больше не разрешены в
SimpleTestCase
.
Валидаторы¶
- Новая функция
DomainNameValidator
проверяет доменные имена, включая интернационализированные доменные имена. Новая функцияvalidate_domain_name()
возвращает экземплярDomainNameValidator
.
Обратные несовместимые изменения в версии 5.1¶
django.contrib.gis
¶
- Поддержка PostGIS 2.5 удалена.
- Поддержка PROJ < 6 удалена.
- Поддержка GDAL 2.4 удалена.
GeoIP2
больше не открываются базы данных по городам и странам, если указан путь к каталогу, предпочтение отдается базе данных по городам, если она доступна. База данных по странам является подмножеством базы данных по городам, и обе они обычно не требуются. Если вам требуется использовать базу данных по странам, находящуюся в том же каталоге, что и база данных по городам, явно передайте конструктору путь к базе данных по странам.
Отменена поддержка MariaDB 10.4¶
Предварительная поддержка MariaDB 10.4 заканчивается в июне 2024 года. Django 5.1 поддерживает MariaDB 10.5 и выше.
Прекращена поддержка PostgreSQL 12¶
Предварительная поддержка PostgreSQL 12 завершится в ноябре 2024 года. Django 5.1 поддерживает PostgreSQL 13 и выше.
Разное¶
- Чтобы улучшить доступность, фильтр списка изменений администратора теперь отображается в теге
<nav>
вместо<div>
. - Чтобы улучшить доступность, нижний колонтитул администратора теперь отображается в виде тега
<footer>
вместо тега<div>
, а также перемещен под элемент<div id="main">
. - В целях улучшения доступности расширяемый виджет, используемый для
ModelAdmin.fieldsets
иInlineModelAdmin.fieldsets
, когда набор полей имеет имя и используется классcollapse
, теперь включает в себя<details>
и<summary>
элементы. - Файл JavaScript
collapse.js
удален, так как он больше не нужен на сайте администратора Django. SimpleTestCase.assertURLEqual()
иassertInHTML()
теперь добавьте": "
кmsg_prefix
. Это согласуется с поведением других утверждений.django.utils.text.Truncator
используется вtruncatechars_html
иtruncatewords_html
фильтрах шаблонов, теперь используются подклассыhtml.parser.HTMLParser
. Это обеспечивает более надежную и быструю работу, но выходные данные могут незначительно отличаться.- Недокументированная функция
django.urls.converters.get_converter()
удалена. - Минимальная поддерживаемая версия SQLite увеличена с 3.27.0 до 3.31.0.
FileField
теперь вызываетFieldError
при сохранении файла безname
.ImageField.update_dimension_fields(force=True)
больше не вызывается после сохранения изображения в хранилище. Если серверная часть хранилища изменит размеры изображений,width_field
иheight_field
не будут соответствовать ширине и высоте изображения.- Минимальная поддерживаемая версия
asgiref
увеличена с 3.7.0 до 3.8.1. - Для повышения производительности действие администратора
delete_selected
теперь используетQuerySet.bulk_create()
при создании нескольких объектовLogEntry
. В результате сигналыpre_save
иpost_save
дляLogEntry
не отправляются при удалении нескольких объектов с помощью этого действия администратора.
Функции, устаревшие в версии 5.1¶
Разное¶
- Методы
ModelAdmin.log_deletion()
иLogEntryManager.log_action()
считаются устаревшими. Вместо них подклассы должны реализовыватьModelAdmin.log_deletions()
иLogEntryManager.log_actions()
. - Недокументированная функция
django.utils.itercompat.is_iterable()
и модульdjango.utils.itercompat
являются устаревшими. Вместо этого используйтеisinstance(..., collections.abc.Iterable)
. - Метод
django.contrib.gis.geoip2.GeoIP2.coords()
признан устаревшим. Вместо него используйтеdjango.contrib.gis.geoip2.GeoIP2.lon_lat()
. - Метод
django.contrib.gis.geoip2.GeoIP2.open()
признан устаревшим. Вместо него используйте конструкторGeoIP2
. - Передача позиционных аргументов в
Model.save()
иModel.asave()
не рекомендуется в пользу аргументов, содержащих только ключевые слова. - Установка
django.contrib.gis.gdal.OGRGeometry.coord_dim
не рекомендуется. Вместо этого используйтеset_3d()
. - Переопределение существующих преобразователей с помощью
django.urls.register_converter()
не рекомендуется. - Аргумент ключевого слова
check
вCheckConstraint
устарел в пользуcondition
. - Недокументированное свойство
OS_OPEN_FLAGS
вFileSystemStorage
не рекомендуется. Чтобы разрешить перезапись файлов в хранилище, установите для нового параметраallow_overwrite
значениеTrue
. - Метод
get_cache_name()
изFieldCacheMixin
устарел в пользу кэшированного свойстваcache_name
.
Функции, удаленные в версии 5.1¶
Срок действия этих функций истек, и они удалены в Django 5.1.
Смотрите Функции, устаревшие в 4.2 для получения подробной информации об этих изменениях, в том числе о том, как отказаться от использования этих функций.
- Метод
BaseUserManager.make_random_password()
будет удален. - Параметр модели
Meta.index_together
удален. - Фильтр шаблона
length_is
удален. - Символы
django.contrib.auth.hashers.SHA1PasswordHasher
,django.contrib.auth.hashers.UnsaltedSHA1PasswordHasher
, иdjango.contrib.auth.hashers.UnsaltedMD5PasswordHasher
будут удалены. - Модель
django.contrib.postgres.fields.CICharField
,django.contrib.postgres.fields.CIEmailField
, иdjango.contrib.postgres.fields.CITextField
удалены, за исключением поддержки в исторических миграциях. - Смешивание
django.contrib.postgres.fields.CIText
будет удалено. - Атрибуты
map_width
иmap_height
изBaseGeometryWidget
будут удалены. - Метод
SimpleTestCase.assertFormsetError()
будет удален. - Метод
TransactionTestCase.assertQuerysetEqual()
будет удален. - Удалена поддержка передачи закодированных строковых литералов JSON в
JSONField
и связанных с ними запросов и выражений. - Удалена поддержка передачи позиционных аргументов в
Signer
иTimestampSigner
. - Настройки
DEFAULT_FILE_STORAGE
иSTATICFILES_STORAGE
будут удалены. - Функция
django.core.files.storage.get_storage_class()
удалена.