Примечания к выпуску 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 }}&amp;
    {% 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.

Валидаторы

Обратные несовместимые изменения в версии 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() удалена.
Вернуться на верх