• 3.1
  • 5.0
  • 6.1
  • Версия документации: 3.2

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

7 августа 2024 г.

Добро пожаловать в Джанго 5.1!

В этих примечаниях к выпуску описаны новые функции, а также некоторые обратно несовместимые изменения, о которых вам следует знать при обновлении с Django 5.0 или более ранней версии. Мы начали процесс прекращения поддержки некоторых функций.

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

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

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

Что нового в Джанго 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 также представлена ​​поддержка пула соединений <postgresql-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

  • Число итераций по умолчанию для хэшера паролей PBKDF2 увеличено с 720 000 до 870 000.

  • Значение параллелизма по умолчанию для 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() теперь предоставляет значения content_code, content_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 теперь поддерживает параметр deduplate_items.

django.contrib.sessions

  • django.contrib.sessions.backends.cached_db.SessionStore теперь обрабатывает исключения при хранении информации о сеансе в кеше, регистрируя правильные сообщения об ошибках с их отслеживанием через недавно добавленный регистратор сеансов.

  • django.contrib.sessions.backends.base.SessionBase и все встроенные механизмы сеансов теперь предоставляют асинхронный API. Все новые асинхронные методы имеют имена с префиксом a, например: aget(), akeys() или acycle_key().

Серверные базы данных

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

  • Чтобы улучшить доступность, на страницах технических ошибок 404 и 500 теперь используются элементы ориентиров HTML для верхнего, нижнего колонтитула и областей основного контента.

Хранение файлов

  • Параметр allow_overwrite в FileSystemStorage теперь позволяет сохранять новые файлы поверх существующих.

Формы

  • Чтобы улучшить доступность и позволить программам чтения с экрана связывать наборы полей с текстом справки, набор полей формы теперь включает HTML-атрибут aria-describedby.

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

Миграции

  • Новый атрибут Operation.category позволяет указать категорию операции <django.db.migrations.operations.base.OperationCategory>, используемую 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 теперь можно разрезать на части.

  • Новый аргумент from_queryset для Model.refresh_from_db() и Model.arefresh_from_db() позволяет настраивать набор запросов, используемый для перезагрузки значения модели. Это можно использовать для блокировки строки перед перезагрузкой или для выбора связанных объектов.

  • Новый атрибут Expression.constraint_validation_совместимый позволяет указать, что выражение следует игнорировать во время проверки ограничения.

Шаблоны

  • Пользовательские теги теперь могут устанавливать дополнительные данные в объекте Parser, которые позже будут доступны в экземпляре Template. Такие данные могут использоваться, например, загрузчиком шаблонов или другими клиентами шаблонов.

  • Движки шаблонов теперь реализуют метод check(), который уже зарегистрирован в системе проверки.

Тесты

  • Утверждения 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.

Функции, устаревшие в версии 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 устарел в пользу условия.

  • Недокументированное свойство 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() удалена.

Back to Top