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

4 августа 2020

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

Эти заметки о выпуске охватывают new features, а также некоторые backwards incompatible changes, о которых вы захотите знать при переходе с Django 3.0 или более ранней версии. Мы dropped some features, которые достигли конца своего цикла устаревания, и мы begun the deprecation process for some features.

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

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

Django 3.1 поддерживает Python 3.6, 3.7, 3.8 и 3.9 (начиная с версии 3.1.3). Мы настоятельно рекомендуем и официально поддерживаем только последний выпуск каждой серии.

Что нового в Django 3.1

Асинхронные представления и поддержка промежуточного программного обеспечения

Django теперь поддерживает полностью асинхронный путь запроса, включая:

Чтобы начать работу с асинхронными представлениями, необходимо объявить представление, используя async def:

async def my_view(request):
    await asyncio.sleep(0.5)
    return HttpResponse('Hello, async world!')

Все асинхронные функции поддерживаются независимо от того, работаете ли вы в режиме WSGI или ASGI. Однако, использование асинхронного кода в режиме WSGI будет снижать производительность. Подробнее об особенностях можно прочитать в документации Поддержка асинхронного режима.

Вы можете смешивать async и sync представления, промежуточное ПО и тесты сколько угодно. Django позаботится о том, чтобы вы всегда получали правильный контекст выполнения. Мы ожидаем, что большинство проектов будут держать большинство своих представлений синхронными, и только некоторые будут работать в режиме async - но это полностью ваш выбор.

ORM, слой кэша и другие части кода Django, которые выполняют длительные сетевые вызовы, пока не поддерживают асинхронный доступ. Мы ожидаем добавить их поддержку в ближайших релизах. Асинхронные представления идеальны, однако, если вы выполняете много вызовов API или HTTP внутри вашего представления, теперь вы можете выполнять все эти HTTP вызовы параллельно, что значительно ускорит выполнение вашего представления.

Асинхронная поддержка должна быть полностью обратно совместима, и мы постарались сделать так, чтобы она не имела никаких регрессий в скорости для вашего существующего синхронного кода. Это не должно оказать заметного влияния на существующие проекты Django.

JSONField для всех поддерживаемых бэкендов баз данных

Django теперь включает models.JSONField и forms.JSONField, которые могут быть использованы на всех поддерживаемых бэкендах баз данных. Оба поля поддерживают использование пользовательских кодировщиков и декодировщиков JSON. Поле model поддерживает интроспекцию, lookups, and transforms, которые ранее были только для PostgreSQL:

from django.db import models

class ContactInfo(models.Model):
    data = models.JSONField()

ContactInfo.objects.create(data={
    'name': 'John',
    'cities': ['London', 'Cambridge'],
    'pets': {'dogs': ['Rufus', 'Meg']},
})
ContactInfo.objects.filter(
    data__name='John',
    data__pets__has_key='dogs',
    data__cities__contains='London',
).delete()

Если в вашем проекте используется django.contrib.postgres.fields.JSONField, плюс связанные с ним поле формы и преобразования, вам следует перестроиться на использование новых полей, а также создать и применить миграцию базы данных. На данный момент старые поля и преобразования оставлены как ссылка на новые и являются deprecated as of this release.

DEFAULT_HASHING_ALGORITHM настройки

Новая переходная настройка DEFAULT_HASHING_ALGORITHM позволяет указать алгоритм хэширования по умолчанию, который будет использоваться для кодирования cookies, токенов сброса пароля на сайте администратора, пользовательских сессий и подписей, созданных с помощью django.core.signing.Signer и django.core.signing.dumps().

Поддержка SHA-256 была добавлена в Django 3.1. Если вы обновляете несколько экземпляров одного и того же проекта до Django 3.1, вам следует установить DEFAULT_HASHING_ALGORITHM на 'sha1' во время перехода, чтобы обеспечить совместимость со старыми версиями Django. Обратите внимание, что для этого требуется Django 3.1.1+. После завершения перехода на 3.1 вы можете перестать переопределять DEFAULT_HASHING_ALGORITHM.

Этот параметр устарел, поскольку поддержка токенов, cookies, сессий и подписей, использующих алгоритм SHA-1, будет удалена в Django 4.0.

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

django.contrib.admin

  • Новый django.contrib.admin.EmptyFieldListFilter для ModelAdmin.list_filter позволяет фильтровать пустые значения (пустые строки и нули) в представлении списка изменений администратора.

  • Фильтры в правой боковой панели просмотра списка изменений администратора теперь содержат ссылку для очистки всех фильтров.

  • На больших экранах администратор теперь имеет боковую панель для более удобной навигации. Она включена по умолчанию, но может быть отключена с помощью пользовательского AdminSite и установки AdminSite.enable_nav_sidebar на False.

    Рендеринг боковой панели требует доступа к текущему запросу для установки CSS и ARIA ролевых возможностей. Для этого необходимо использовать 'django.template.context_processors.request' в опции 'context_processors' в опции OPTIONS.

  • Изначально пустые строки extra теперь могут быть удалены так же, как и динамически создаваемые.

  • XRegExp обновляется с версии 2.0.0 до 3.2.0.

  • jQuery обновлен с версии 3.4.1 до 3.5.1.

  • Библиотека Select2 обновлена с версии 4.0.7 до 4.0.13.

django.contrib.auth

  • Количество итераций по умолчанию для хешера паролей PBKDF2 увеличено со 180 000 до 216 000.
  • Новый параметр PASSWORD_RESET_TIMEOUT позволяет определить количество секунд, в течение которых действует ссылка на сброс пароля. Это рекомендуется вместо устаревшей настройки PASSWORD_RESET_TIMEOUT_DAYS, которая будет удалена в Django 4.0.
  • Механизм сброса пароля теперь использует алгоритм хэширования SHA-256. Поддержка токенов, использующих старый алгоритм хэширования, сохранится до версии Django 4.0.
  • AbstractBaseUser.get_session_auth_hash() теперь использует алгоритм хэширования SHA-256. Поддержка пользовательских сессий, использующих старый алгоритм хэширования, сохранится до версии Django 4.0.

django.contrib.contenttypes

django.contrib.gis

  • Поиск relate теперь поддерживается на MariaDB.
  • Добавлено свойство LinearRing.is_counterclockwise.
  • AsGeoJSON теперь поддерживается на Oracle.
  • Добавлены функции AsWKB и AsWKT.
  • Добавлена поддержка PostGIS 3 и GDAL 3.

django.contrib.humanize

  • Фильтр шаблона intword теперь поддерживает отрицательные целые числа.

django.contrib.postgres

django.contrib.sessions

  • Настройка SESSION_COOKIE_SAMESITE теперь позволяет использовать значение 'None' (строка), чтобы явно указать, что cookie отправляется со всеми односайтовыми и межсайтовыми запросами.

django.contrib.staticfiles

Кэш

  • Декоратор cache_control() и метод patch_cache_control() теперь поддерживают множественные имена полей в директиве no-cache для заголовка Cache-Control, согласно RFC 7234#section-5.2.2.2.
  • delete() теперь возвращает True, если ключ был успешно удален, False в противном случае.

CSRF

  • Настройка CSRF_COOKIE_SAMESITE теперь позволяет использовать значение 'None' (строка), чтобы явно указать, что cookie отправляется со всеми односайтовыми и межсайтовыми запросами.

Электронная почта

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

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

  • Метод FileSystemStorage.save() теперь поддерживает pathlib.Path.
  • FileField и ImageField теперь принимают вызов для storage. Это позволяет изменять используемое хранилище во время выполнения, например, выбирать разные хранилища для разных сред.

Формы

  • ModelChoiceIterator, используемый ModelChoiceField и ModelMultipleChoiceField, теперь использует ModelChoiceIteratorValue, который может быть использован виджетами для доступа к экземплярам модели. Подробности смотрите в Итерация выбора отношений.

  • django.forms.DateTimeField теперь принимает даты в подмножестве форматов времени ISO 8601, включая необязательный часовой пояс, например, 2019-10-10T06:47, 2019-10-10T06:47:23+04:00 или 2019-10-10T06:47:23Z. Часовой пояс всегда будет сохранен, если он указан, при этом даты с учетом часового пояса будут возвращены даже в том случае, если USE_TZ будет False.

    Кроме того, DateTimeField теперь использует DATE_INPUT_FORMATS в дополнение к DATETIME_INPUT_FORMATS при преобразовании ввода поля в значение datetime.

  • MultiWidget.widgets теперь принимает словарь, который позволяет настраивать атрибуты субвиджета name.

  • Новое свойство BoundField.widget_type может быть использовано для динамической настройки рендеринга формы в зависимости от типа виджета.

Интернационализация

  • Настройка LANGUAGE_COOKIE_SAMESITE теперь позволяет использовать значение 'None' (строка), чтобы явно указать, что cookie отправляется со всеми односайтовыми и межсайтовыми запросами.
  • Добавлена поддержка и переводы для алжирского арабского, игбо, кыргызского, таджикского и туркменского языков.

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

  • Новая опция check --database позволяет указать псевдонимы баз данных для запуска системных проверок database. Ранее эти проверки включались для всех настроенных DATABASES путем передачи команде тега database.
  • Новая опция migrate --check заставляет команду завершать работу с ненулевым статусом при обнаружении непримененных миграций.
  • Новый аргумент returncode для CommandError позволяет настраивать статус выхода для команд управления.
  • Новая опция dbshell -- ARGUMENTS позволяет передавать дополнительные аргументы клиенту командной строки для базы данных.
  • Команды flush и sqlflush теперь включают SQL для сброса последовательностей на SQLite.

Модели

  • Новая функция ExtractIsoWeekDay извлекает дни недели ISO-8601 из DateField и DateTimeField, а новый поиск iso_week_day позволяет выполнять запрос по дню недели ISO-8601.
  • QuerySet.explain() теперь поддерживает:
    • TREE формат на MySQL 8.0.16+,
    • analyze опция на MySQL 8.0.18+ и MariaDB.
  • Добавлено PositiveBigIntegerField, которое действует так же, как PositiveIntegerField, за исключением того, что оно допускает только значения ниже определенного (зависящего от базы данных) предела. Значения от 0 до 9223372036854775807 безопасны во всех базах данных, поддерживаемых Django.
  • Новая опция RESTRICT для аргумента on_delete аргументов ForeignKey и OneToOneField эмулирует поведение SQL-ограничения ON DELETE RESTRICT.
  • CheckConstraint.check теперь поддерживает булевы выражения.
  • Методы RelatedManager.add(), create() и set() теперь принимают callables как значения в аргументе through_defaults.
  • Новый параметр is_dst QuerySet.datetimes() определяет обработку несуществующих и неоднозначных дат.
  • Новый метод F выражения bitxor() позволяет bitwise XOR operation.
  • QuerySet.bulk_create() теперь устанавливает первичный ключ для объектов при использовании MariaDB 10.5+.
  • Метод DatabaseOperations.sql_flush() теперь генерирует более эффективный SQL на MySQL, используя DELETE вместо TRUNCATE операторов для таблиц, которые не требуют сброса последовательностей.
  • Функции SQLite теперь помечены как :py<<<0 >>> на Python 3.8+. Это позволяет использовать их в проверочных ограничениях и частичных индексах.
  • Новый атрибут UniqueConstraint.deferrable позволяет создавать откладываемые уникальные ограничения.

Пагинация

  • Paginator теперь можно итерировать, чтобы получить его страницы.

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

  • Если ALLOWED_HOSTS пуст и DEBUG=True, то теперь в заголовке Host разрешены поддомены localhost, например, static.localhost.
  • HttpResponse.set_cookie() и HttpResponse.set_signed_cookie() теперь позволяют использовать samesite='None' (строка), чтобы явно указать, что cookie отправляется со всеми односайтовыми и межсайтовыми запросами.
  • Новый метод HttpRequest.accepts() возвращает, принимает ли запрос данный MIME-тип в соответствии с HTTP-заголовком Accept.

Безопасность

  • Настройкой SECURE_REFERRER_POLICY теперь по умолчанию является 'same-origin'. При такой настройке SecurityMiddleware устанавливает заголовок Политика в отношении рефералов в same-origin во всех ответах, которые еще не имеют его. Это предотвращает отправку заголовка Referer другим источникам. Если вам нужно предыдущее поведение, явно установите SECURE_REFERRER_POLICY в None.

  • Алгоритм по умолчанию django.core.signing.Signer, django.core.signing.loads() и django.core.signing.dumps() изменен на SHA-256. Поддержка подписей, сделанных по старому алгоритму SHA-1, сохранится до версии Django 4.0.

    Кроме того, новый параметр algorithm Signer позволяет настроить алгоритм хэширования.

Шаблоны

  • Переименованные теги шаблонов translate и blocktranslate введены для интернационализации в коде шаблонов. Старые псевдонимы тегов шаблонов trans и blocktrans продолжают работать и будут сохранены в обозримом будущем.
  • Тег шаблона include теперь принимает итерабельные имена шаблонов.

Тесты

  • SimpleTestCase теперь реализует метод debug(), позволяющий запускать тест без сбора результата и перехвата исключений. Это может быть использовано для поддержки выполнения тестов под отладчиком.
  • Новая настройка тестовой базы данных MIGRATE позволяет отключить миграции во время создания тестовой базы данных.
  • Бегунок тестирования Django теперь поддерживает опцию test --buffer для отбрасывания вывода для пройденных тестов.
  • DiscoverRunner теперь пропускает выполнение системных проверок для баз данных, не referenced by tests.
  • TransactionTestCase teardown теперь быстрее на MySQL благодаря улучшению команды flush. В качестве побочного эффекта последняя больше не сбрасывает автоматически последовательности при сносе. Включите TransactionTestCase.reset_sequences, если ваши тесты требуют этой возможности.

URL-адреса

  • Path converters теперь может поднять ValueError в to_url(), чтобы указать на отсутствие совпадения при реверсировании URL.

Утилиты

Разное

  • Бэкенд SQLite теперь поддерживает pathlib.Path для параметра NAME.
  • settings.py, генерируемый командой startproject, теперь использует pathlib.Path вместо os.path для построения путей к файловой системе.
  • Настройка TIME_ZONE теперь разрешена в базах данных, поддерживающих часовые пояса.

Изменения в версии 3.1, несовместимые с обратными изменениями

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

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

  • DatabaseOperations.fetch_returned_insert_columns() теперь требует дополнительного аргумента returning_params.
  • Свойство connection.timezone теперь 'UTC' по умолчанию, или TIME_ZONE, когда USE_TZ равно True на базах данных, поддерживающих часовые пояса. Ранее оно было None на базах данных, поддерживающих часовые пояса.
  • Свойство connection._nodb_connection изменено на метод connection._nodb_cursor() и теперь возвращает менеджер контекста, который выдает курсор и автоматически закрывает курсор и соединение при выходе из оператора with.
  • DatabaseClient.runshell() теперь требует дополнительный аргумент parameters в качестве списка дополнительных аргументов для передачи клиенту командной строки.
  • Позиционный аргумент sequences из DatabaseOperations.sql_flush() заменяется на аргумент reset_sequences, содержащий только булевы ключевые слова. Если True, последовательности усеченных таблиц будут сброшены.
  • Аргумент allow_cascade в DatabaseOperations.sql_flush() теперь является аргументом только для ключевого слова.
  • Позиционный аргумент using из DatabaseOperations.execute_sql_flush() удален. Теперь метод использует базу данных вызванного экземпляра.
  • Бэкенды баз данных сторонних производителей должны реализовать поддержку JSONField или установить DatabaseFeatures.supports_json_field в False. Если хранение примитивов не поддерживается, установите DatabaseFeatures.supports_primitives_in_json_field в False. Если существует истинный тип данных для JSON, установите DatabaseFeatures.has_native_json_field в True. Если jsonfield.contains и jsonfield.contained_by не поддерживаются, установите DatabaseFeatures.supports_json_field_contains в False.
  • Сторонние бэкенды баз данных должны реализовать интроспекцию для JSONField или установить can_introspect_json_field в False.

Прекращена поддержка MariaDB 10.1

Поддержка MariaDB 10.1 заканчивается в октябре 2020 года. Django 3.1 поддерживает MariaDB 10.2 и выше.

contrib.admin поддержка браузера

Администратор больше не поддерживает устаревший браузер Internet Explorer. Подробности о поддерживаемых браузерах смотрите в the admin FAQ.

AbstractUser.first_name max_length увеличено до 150

Миграция для django.contrib.auth.models.User.first_name включена. Если у вас есть пользовательская модель пользователя, наследующая от AbstractUser, вам необходимо создать и применить миграцию базы данных для вашей модели пользователя.

Если вы хотите сохранить ограничение в 30 символов для имен, используйте пользовательскую форму:

from django import forms
from django.contrib.auth.forms import UserChangeForm

class MyUserChangeForm(UserChangeForm):
    first_name = forms.CharField(max_length=30, required=False)

Если вы хотите сохранить это ограничение в админке при редактировании пользователей, установите UserAdmin.form для использования этой формы:

from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User

class MyUserAdmin(UserAdmin):
    form = MyUserChangeForm

admin.site.unregister(User)
admin.site.register(User, MyUserAdmin)

Разное

  • Ключи кэша, используемые cache и генерируемые make_template_fragment_key(), отличаются от ключей, генерируемых старыми версиями Django. После обновления до Django 3.1 первый запрос к любому ранее кэшированному фрагменту шаблона будет пропуском кэша.
  • Логика решения о возврате отката перенаправления или ответа 204 HTTP из представления set_language() теперь основана на наличии заголовка Accept HTTP вместо наличия заголовка X-Requested-With HTTP.
  • Импорт совместимости django.core.exceptions.EmptyResultSet в django.db.models.query, django.db.models.sql и django.db.models.sql.datastructures удален.
  • Импорт совместимости django.core.exceptions.FieldDoesNotExist в django.db.models.fields удален.
  • Импорт совместимости django.forms.utils.pretty_name() и django.forms.boundfield.BoundField в django.forms.forms удален.
  • Импорт совместимости Context, ContextPopException и RequestContext в django.template.base удален.
  • Импорт совместимости django.contrib.admin.helpers.ACTION_CHECKBOX_NAME в django.contrib.admin удален.
  • Параметры STATIC_URL и MEDIA_URL, установленные на относительные пути, теперь имеют префикс SCRIPT_NAME (или /, если он не установлен). Это изменение не должно повлиять на настройки, установленные для действительных URL или абсолютных путей.
  • ConditionalGetMiddleware больше не добавляет заголовок ETag к ответам с пустым content.
  • Декоратор django.utils.decorators.classproperty() становится публичным и переносится в django.utils.functional.classproperty().
  • Фильтр шаблона floatformat теперь выводит (положительный) 0 для отрицательных чисел, которые округляются до нуля.
  • Опции Meta.ordering и Meta.unique_together для моделей в модулях django.contrib, которые раньше были кортежами, теперь стали списками.
  • Виджет календаря администратора теперь обрабатывает двузначные годы в соответствии со спецификацией Open Group Specification, т.е. значения от 69 до 99 отображаются на предыдущий век, а значения от 0 до 68 отображаются на текущий век.
  • Форматы только для даты удалены из списка по умолчанию для DATETIME_INPUT_FORMATS.
  • Виджет FileInput больше не отображается с HTML-атрибутом required при наличии начальных данных.
  • Недокументированный класс django.views.debug.ExceptionReporterFilter удален. Согласно документации Пользовательские отчеты об ошибках, классы для использования с DEFAULT_EXCEPTION_REPORTER_FILTER должны наследоваться от django.views.debug.SafeExceptionReporterFilter.
  • Таймаут кэша, установленный декоратором cache_page(), теперь имеет приоритет над директивой max-age из заголовка Cache-Control.
  • Предоставление нелокального удаленного поля в аргументе ForeignKey.to_field теперь приводит к появлению FieldError.
  • SECURE_REFERRER_POLICY теперь имеет значение по умолчанию 'same-origin'. Подробнее см. в разделе Что нового Security section выше.
  • Команда управления check теперь запускает системные проверки database только для псевдонимов баз данных, указанных с помощью опции check --database.
  • Команда управления migrate теперь запускает системные проверки database только для базы данных для миграции.
  • Админские CSS-классы row1 и row2 удалены в пользу псевдоклассов :nth-child(odd) и :nth-child(even).
  • Функция make_password() теперь требует, чтобы ее аргумент был строкой или байтом. Другие типы должны быть явно приведены к одному из этих типов.
  • Удален недокументированный параметр version в функции AsKML.
  • JSON and YAML serializers, используемый dumpdata, теперь по умолчанию передает все данные с Юникодом. Если вам нужно прежнее поведение, передайте ensure_ascii=True сериализатору JSON, или allow_unicode=False сериализатору YAML.
  • Автозагрузчик больше не отслеживает изменения во встроенных файлах переводов Django.
  • Минимальная поддерживаемая версия mysqlclient увеличена с 1.3.13 до 1.4.0.
  • Недокументированные django.contrib.postgres.forms.InvalidJSONInput и django.contrib.postgres.forms.JSONString перенесены в django.forms.fields.
  • Недокументированный класс django.contrib.postgres.fields.jsonb.JsonAdapter удален.
  • Тег {% localize off %} и фильтр unlocalize больше не уважают настройку DECIMAL_SEPARATOR.
  • Минимальная поддерживаемая версия asgiref увеличена с 3.2 до 3.2.10.
  • Класс Media теперь отображает теги <script> без атрибута type, следующие за WHATWG recommendations.
  • ModelChoiceIterator, используемый ModelChoiceField и ModelMultipleChoiceField, теперь дает выбор из двух кортежей, содержащих экземпляры ModelChoiceIteratorValue в качестве первого value элемента в каждом выборе. В большинстве случаев это прозрачно, но если вам нужно само значение field, используйте вместо него атрибут ModelChoiceIteratorValue.value.

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

PostgreSQL JSONField

django.contrib.postgres.fields.JSONField и django.contrib.postgres.forms.JSONField устарели в пользу models.JSONField и forms.JSONField.

Недокументированные django.contrib.postgres.fields.jsonb.KeyTransform и django.contrib.postgres.fields.jsonb.KeyTextTransform также устарели в пользу преобразований в django.db.models.fields.json.

Новые JSONFields, KeyTransform и KeyTextTransform могут быть использованы на всех поддерживаемых бэкендах баз данных.

Разное

  • Настройка PASSWORD_RESET_TIMEOUT_DAYS устарела в пользу PASSWORD_RESET_TIMEOUT.

  • Недокументированное использование поиска isnull с небулевыми значениями в качестве правой части устарело, вместо этого используйте True или False.

  • Мало документированный класс исключений django.db.models.query_utils.InvalidQuery устарел в пользу FieldDoesNotExist и FieldError.

  • Точка входа django-admin.py устарела в пользу django-admin.

  • Метод HttpRequest.is_ajax() устарел, так как он полагался на специфический для jQuery способ обозначения AJAX-вызовов, в то время как в настоящее время, как правило, используется JavaScript Fetch API. В зависимости от вашего случая использования, вы можете либо написать свой собственный метод определения AJAX, либо использовать новый метод HttpRequest.accepts(), если ваш код зависит от HTTP-заголовка клиента Accept.

    Если вы пишете свой собственный метод обнаружения AJAX, request.is_ajax() можно воспроизвести точно так же, как request.headers.get('x-requested-with') == 'XMLHttpRequest'.

  • Передача None в качестве первого аргумента в django.utils.deprecation.MiddlewareMixin.__init__() устарела.

  • Формат кодировки значений cookies, используемый CookieStorage, отличается от формата, генерируемого старыми версиями Django. Поддержка старого формата сохраняется до версии Django 4.0.

  • Формат кодировки сессий отличается от формата, генерируемого старыми версиями Django. Поддержка старого формата сохранится до версии Django 4.0.

  • Чисто документальный аргумент providing_args для Signal является устаревшим. Если вы используете этот аргумент в качестве документации, вы можете переместить текст в комментарий к коду или в doc-строку.

  • Вызов django.utils.crypto.get_random_string() без аргумента length является устаревшим.

  • Сообщение list для ModelMultipleChoiceField устарело в пользу invalid_list.

  • Передача необработанных псевдонимов столбцов в QuerySet.order_by() устарела. Того же результата можно добиться, предварительно передав псевдонимы в RawSQL.

  • Поле модели NullBooleanField устарело в пользу BooleanField(null=True).

  • django.conf.urls.url() псевдоним django.urls.re_path() устарел.

  • Теги шаблонов {% ifequal %} и {% ifnotequal %} устарели в пользу {% if %}. {% if %} покрывает все случаи использования, но если вам нужно продолжать использовать эти теги, они могут быть извлечены из Django в модуль и включены как встроенный тег в опцию 'builtins' в OPTIONS.

  • DEFAULT_HASHING_ALGORITHM переходная установка устарела.

Функции, удаленные в версии 3.1

Эти функции достигли конца своего цикла устаревания и будут удалены в Django 3.1.

Смотрите Функции, устаревшие в версии 2.2 для получения подробной информации об этих изменениях, включая то, как удалить использование этих функций.

  • django.utils.timezone.FixedOffset удаляется.
  • django.core.paginator.QuerySetPaginator удаляется.
  • Модель Meta.ordering не влияет на запросы GROUP BY.
  • django.contrib.postgres.fields.FloatRangeField и django.contrib.postgres.forms.FloatRangeField удаляются.
  • Настройка FILE_CHARSET удаляется.
  • django.contrib.staticfiles.storage.CachedStaticFilesStorage удаляется.
  • Метод RemoteUserBackend.configure_user() требует request в качестве первого позиционного аргумента.
  • Удалена поддержка SimpleTestCase.allow_database_queries и TransactionTestCase.multi_db.
Вернуться на верх