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

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

6 апреля 2021 г.

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

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

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

Django 3.2 обозначен как выпуск с долгосрочной поддержкой. Он будет получать обновления безопасности в течение как минимум трех лет после выпуска. Поддержка предыдущей LTS, Django 2.2, закончится в апреле 2022 года.

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

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

Что нового в Джанго 3.2

Автоматическое обнаружение AppConfig

Большинство подключаемых приложений определяют подкласс AppConfig в подмодуле apps.py. Многие определяют переменную default_app_config, указывающую на этот класс, в своем __init__.py.

Если субмодуль apps.py существует и определяет один подкласс AppConfig, Django теперь использует эту конфигурацию автоматически, поэтому вы можете удалить default_app_config.

default_app_config позволил объявить только путь приложения в INSTALLED_APPS (например, 'django.contrib.admin'), а не путь конфигурации приложения (например, 'django.contrib.admin.apps.AdminConfig'). Он был введен для обеспечения обратной совместимости с первым стилем с намерением переключить экосистему на второй, но переключения не произошло.

При автоматическом обнаружении AppConfig default_app_config больше не требуется. Как следствие, он устарел.

Подробную информацию см. в разделе Настройка приложений.

Настройка типа автоматически создаваемых первичных ключей

Если при определении модели ни одно поле в модели не определено с помощью primary_key=True, добавляется неявный первичный ключ. Типом этого неявного первичного ключа теперь можно управлять с помощью параметра DEFAULT_AUTO_FIELD и атрибута AppConfig.default_auto_field. Больше нет необходимости переопределять первичные ключи во всех моделях.

Сохраняя историческое поведение, значением по умолчанию для DEFAULT_AUTO_FIELD является AutoField. Начиная с версии 3.2, новые проекты генерируются с параметром DEFAULT_AUTO_FIELD, установленным в BigAutoField. Кроме того, новые приложения генерируются с помощью AppConfig.default_auto_field, установленного в BigAutoField. В будущем выпуске Django значение по умолчанию DEFAULT_AUTO_FIELD будет изменено на BigAutoField.

Чтобы избежать нежелательной миграции в будущем, либо явно установите DEFAULT_AUTO_FIELD в AutoField:

DEFAULT_AUTO_FIELD = "django.db.models.AutoField"

или настройте его для каждого приложения:

from django.apps import AppConfig


class MyAppConfig(AppConfig):
    default_auto_field = "django.db.models.AutoField"
    name = "my_app"

или для каждой модели:

from django.db import models


class MyModel(models.Model):
    id = models.AutoField(primary_key=True)

В ожидании изменения значения по умолчанию проверка системы выдаст предупреждение, если у вас нет явной настройки для DEFAULT_AUTO_FIELD.

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

Функциональные индексы

Новый *expressions позиционный аргумент Index() позволяет создавать функциональные индексы для выражений и функций базы данных. Например:

from django.db import models
from django.db.models import F, Index, Value
from django.db.models.functions import Lower, Upper


class MyModel(models.Model):
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)
    height = models.IntegerField()
    weight = models.IntegerField()

    class Meta:
        indexes = [
            Index(
                Lower("first_name"),
                Upper("last_name").desc(),
                name="first_last_name_idx",
            ),
            Index(
                F("height") / (F("weight") + Value(5)),
                name="calc_idx",
            ),
        ]

Функциональные индексы добавляются в модели с помощью опции Meta.indexes.

поддержка pymemcache

Новый механизм кэширования django.core.cache.backends.memcached.PyMemcacheCache позволяет использовать библиотеку pymemcache для memcached. Требуется pymemcache 3.4.0 или выше. Более подробную информацию см. в документации по кэшированию в Django.

Новые декораторы для админки

Новый декоратор display() позволяет легко добавлять параметры к пользовательским функциям отображения, которые можно использовать с list_display или readonly_fields.

Аналогично, новый декоратор action() позволяет легко добавлять параметры к функциям действий, которые можно использовать с actions.

Использование декоратора @display имеет то преимущество, что теперь можно использовать декоратор @property, когда необходимо указать атрибуты в пользовательском методе. До этого необходимо было использовать функцию property() после присвоения методу необходимых атрибутов.

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

Минорные изменения

django.contrib.admin

  • ModelAdmin.search_fields теперь позволяет выполнять поиск по цитируемым фразам с пробелами.

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

  • Администратор теперь поддерживает темы и включает темную тему, которая включается в соответствии с настройками браузера. Подробнее см. Поддержка тем.

  • ModelAdmin.autocomplete_fields теперь учитывает ForeignKey.to_field и ForeignKey.limit_choices_to при поиске связанной модели.

  • Теперь администратор устанавливает окончательное универсальное представление, которое перенаправляет неаутентифицированных пользователей на страницу входа, независимо от того, действителен ли в противном случае URL-адрес. Это защищает от потенциальной проблемы конфиденциальности перечисления моделей.

    Хотя это и не рекомендуется, вы можете установить для нового параметра AdminSite.final_catch_all_view значение False, чтобы отключить просмотр всех элементов.

django.contrib.auth

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

  • Вариант по умолчанию для хэшера паролей Argon2 изменен на Argon2id. memory_cost и parallelism увеличены до 102 400 и 8 соответственно, чтобы соответствовать значениям по умолчанию argon2-cffi.

    Увеличение «memory_cost» увеличивает требуемый объем памяти с 512 КБ до 100 МБ. Это все еще довольно консервативный подход, но может привести к проблемам в средах с ограниченной памятью. В этом случае существующий хеш может быть подклассом, чтобы переопределить значения по умолчанию.

  • Соляная энтропия по умолчанию для хешеров паролей Argon2, MD5, PBKDF2, SHA-1 увеличена с 71 до 128 бит.

django.contrib.contenttypes

django.contrib.gis

django.contrib.postgres

  • Новый атрибут ExclusionConstraint.include позволяет создавать покрывающие ограничения исключения в PostgreSQL 12+.

  • Новый атрибут ExclusionConstraint.opclasses позволяет устанавливать классы операторов PostgreSQL.

  • Новый атрибут JSONBAgg.ordering определяет порядок агрегированных элементов.

  • Новый атрибут JSONBAgg.distinct определяет, будут ли агрегированные значения различны.

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

  • Новые операции CreateCollation и RemoveCollation позволяют создавать и удалять параметры сортировки в PostgreSQL. Дополнительную информацию см. в разделе Управление параметрами сортировки с помощью миграций.

  • Поиск по ArrayField теперь позволяет использовать (невложенные) массивы, содержащие выражения в правой части.

  • Новое выражение OpClass() позволяет создавать функциональные индексы для выражений с помощью специального класса операторов. Дополнительную информацию см. в Функциональные индексы.

django.contrib.sitemaps

  • Новые атрибуты Sitemap alternates, languages и x_default позволяют создавать карту сайта. альтернативно локализованным версиям ваших страниц.

django.contrib.syndicate

  • Новый хук item_comments позволяет указать URL-адрес комментариев для каждого элемента фида.

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

  • Сторонние базы данных теперь могут пропускать или отмечать тесты с ожидаемыми ошибками в наборе тестов Django, используя новые атрибуты DatabaseFeatures.django_test_skips и django_test_expected_failures.

Декораторы

  • Новый декоратор no_append_slash() позволяет исключать отдельные представления из APPEND_SLASH нормализации URL-адресов.

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

  • Пользовательские подклассы ExceptionReporter теперь могут определять свойства html_template_path и text_template_path для переопределения шаблонов, используемых для отображения отчетов об исключениях.

Загрузка файлов

Формы

  • Новый аргумент absolute_max для formset_factory(), inlineformset_factory() и modelformset_factory() позволяет настроить максимальное количество форм, экземпляры которых могут быть созданы при передаче данных POST. Дополнительную информацию см. в Ограничение максимального количества экземпляров форм.

  • Новый аргумент can_delete_extra для formset_factory(), inlineformset_factory() и modelformset_factory() позволяет удалить опцию удаления дополнительных форм. См. can_delete_extra для получения дополнительной информации.

  • BaseFormSet теперь сообщает об ошибке, с которой столкнулся пользователь, а не вызывает исключение, когда форма управления отсутствует или была изменена. Чтобы настроить это сообщение об ошибке, передайте аргумент error_messages с ключом Missing_management_form при создании экземпляра набора форм.

Общие представления

  • Атрибуты week_format WeekMixin и WeekArchiveView теперь поддерживают формат недели '%V' ISO 8601.

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

  • loaddata теперь поддерживает фикстуры, хранящиеся в архивах XZ (.xz) и архивах LZMA (.lzma).

  • dumpdata теперь может сжимать данные в форматах bz2, gz, lzma или xz.

  • makemigrations теперь можно вызывать без активного подключения к базе данных. В этом случае проверка целостности истории миграции пропускается.

  • BaseCommand.requires_system_checks теперь поддерживает указание списка тегов. Системные проверки, зарегистрированные в выбранных тегах, будут проверены на наличие ошибок перед выполнением команды. В предыдущих версиях либо все проверки системы, либо ни одна из них не выполнялись.

  • Обновлена ​​поддержка цветного вывода терминала в Windows. Автоматически определяются различные современные терминальные среды, а также улучшаются возможности включения поддержки в других случаях. Подробнее см. Подсветка синтаксиса.

Миграции

  • Новое свойство Operation.migration_name_fragment позволяет предоставить фрагмент имени файла, который будет использоваться для названия миграции, содержащей только эту операцию.

  • Миграции теперь поддерживают сериализацию чистых и конкретных объектов пути из экземпляров pathlib и os.PathLike.

Модели

  • Новый параметр no_key для QuerySet.select_for_update(), поддерживаемый в PostgreSQL, позволяет получать более слабые блокировки, которые не блокируют создание строк, ссылающихся на заблокированные строки через внешний ключ.

  • Выражение When() теперь позволяет использовать аргумент condition с поисками.

  • Новые атрибуты Index.include и UniqueConstraint.include позволяют создавать покрывающие индексы и охватывать ограничения уникальности в PostgreSQL 11+.

  • Новый атрибут UniqueConstraint.opclasses позволяет устанавливать классы операторов PostgreSQL.

  • Метод QuerySet.update() теперь учитывает предложение order_by() в MySQL и MariaDB.

  • FilteredRelation() теперь поддерживает вложенные отношения.

  • Аргумент of для QuerySet.select_for_update() теперь разрешен в MySQL 8.0.1+.

  • Выражение Value() теперь автоматически преобразует свое output_field в соответствующий подкласс Field на основе типа предоставленного им значения для bool, bytes, float, int, str, datetime.date, datetime.datetime, datetime.time, datetime.timedelta, decimal.Decimal и uuid.UUID. Как следствие, разрешение output_field для функций базы данных и комбинированных выражений теперь может привести к сбою со смешанными типами при использовании Value(). В таких случаях вам нужно будет явно установить output_field.

  • Новый метод QuerySet.alias() позволяет создавать многоразовые псевдонимы для выражений, которые не нужно выбирать, но которые используются для фильтрации, упорядочивания или как часть сложных выражений.

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

  • Аргумент field_name QuerySet.in_bulk() теперь принимает отдельные поля, если в QuerySet.distinct() указано только одно поле.

  • Новый параметр tzinfo функций базы данных TruncDate и TruncTime позволяет усекать дату и время в определенном часовом поясе.

  • Новый аргумент db_collation для CharField и TextField позволяет установить параметры сортировки базы данных для поля.

  • Добавлена ​​функция базы данных Random.

  • Функции агрегации, F(), OuterRef() и другие выражения теперь позволяют использовать преобразования. Подробности смотрите в разделе Выражения могут ссылаться на преобразования.

  • Новый аргумент durable для atomic() гарантирует, что изменения, сделанные в атомарном блоке, будут зафиксированы, если блок завершится без ошибок. Вложенный атомный блок, помеченный как прочный, вызовет ошибку RuntimeError.

  • Добавлена ​​функция базы данных JSONObject.

Пагинация

  • Новый метод django.core.paginator.Paginator.get_elided_page_range() позволяет генерировать диапазон страниц с исключенными некоторыми значениями. Если страниц много, это может быть полезно для создания разумного количества ссылок на страницы в шаблоне.

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

  • Заголовки ответов теперь хранятся в HttpResponse.headers. Его можно использовать вместо исходного dict-подобного интерфейса объектов HttpResponse. Оба интерфейса будут продолжать поддерживаться. Подробности смотрите в разделе Установка заголовков.

  • Новый параметр headers для HttpResponse, SimpleTemplateResponse и TemplateResponse позволяет устанавливать ответ headers при создании экземпляра.

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

  • Допустимое значение параметра SECRET_KEY теперь проверяется при первом доступе, а не при первой загрузке настроек. Это позволяет запускать команды управления, которые не полагаются на SECRET_KEY, без необходимости предоставления значения. Как следствие этого, вызов configure() без указания допустимого SECRET_KEY, а затем переход к settings.SECRET_KEY теперь вызовет исключение ImproperlyConfigured.

  • Новые методы Signer.sign_object() и Signer.unsign_object() позволяют подписывать сложные структуры данных. Дополнительную информацию см. в Защита сложных структур данных.

    Кроме того, signing.dumps() и loads() становятся ярлыками для TimestampSigner.sign_object() и unsign_object().

Сериализация

  • Новый сериализатор JSONL позволяет использовать формат JSON Lines с dumpdata и loaddata. Это может быть полезно для заполнения больших баз данных, поскольку данные загружаются в память построчно, а не все сразу.

Сигналы

Шаблоны

  • Фильтр шаблонов floatformat теперь позволяет использовать суффикс g для принудительной группировки по THOUSAND_SEPARATOR для активной локали.

  • Шаблоны, кэшированные с помощью Кэшированных загрузчиков шаблонов, теперь корректно перезагружаются в процессе разработки.

Тесты

  • Объекты, присвоенные атрибутам класса в TestCase.setUpTestData(), теперь изолированы для каждого метода тестирования. Такие объекты теперь должны поддерживать создание глубоких копий с помощью copy.deepcopy(). Назначение объектов, которые не поддерживают deepcopy(), устарело и будет удалено в Django 4.1.

  • DiscoverRunner теперь включает faulthandler по умолчанию. Это можно отключить с помощью опции test --no-faulthandler.

  • DiscoverRunner и команда управления test теперь могут отслеживать время, включая настройку базы данных и общее время выполнения. Это можно включить с помощью опции test --timing.

  • Client теперь сохраняет строку запроса при следовании по перенаправлениям 307 и 308.

  • Новый метод TestCase.captureOnCommitCallbacks() фиксирует в списке функции обратного вызова, передаваемые в transaction.on_commit(). Это позволяет вам тестировать такие обратные вызовы без использования более медленного TransactionTestCase.

  • TransactionTestCase.assertQuerysetEqual() теперь поддерживает прямое сравнение с другим набором запросов, а не ограничивается сравнением со списком строковых представлений объектов при использовании значения по умолчанию для аргумента transform.

Утилиты

  • Новый параметр глубины функций django.utils.timesince.timesince() и django.utils.timesince.timeuntil() позволяет указать количество возвращаемых соседних единиц времени.

Валидаторы

  • Встроенные валидаторы теперь включают указанное значение в аргумент params возникшего ValidationError. Это позволяет пользовательским сообщениям об ошибках использовать заполнитель %(value)s.

  • Оператор равенства ValidationError теперь игнорирует порядок messages и params.

Изменения обратной несовместимости в версии 3.2

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

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

  • Новое свойство DatabaseFeatures.introspected_field_types заменяет эти функции:

    • can_introspect_autofield

    • can_introspect_big_integer_field

    • can_introspect_binary_field

    • can_introspect_decimal_field

    • can_introspect_duration_field

    • can_introspect_ip_address_field

    • can_introspect_positive_integer_field

    • can_introspect_small_integer_field

    • can_introspect_time_field

    • introspected_big_auto_field_type

    • introspected_small_auto_field_type

    • introspected_boolean_field_type

  • Чтобы включить поддержку покрытия индексов (Index.include) и покрытия уникальных ограничений (UniqueConstraint.include), установите для DatabaseFeatures.supports_covering_indexes значение True.

  • Сторонние базы данных должны реализовать поддержку сортировки базы данных столбцов для CharFields и TextFields или установить для DatabaseFeatures.supports_collation_on_charfield и DatabaseFeatures.supports_collation_on_textfield значение False. Если недетерминированные параметры сортировки не поддерживаются, установите для параметра «supports_non_deterministic_collations» значение «False».

  • DatabaseOperations.random_function_sql() удален в пользу новой функции базы данных Random.

  • DatabaseOperations.date_trunc_sql() и DatabaseOperations.time_trunc_sql() теперь принимают необязательный аргумент tzname для усечения в определенном часовом поясе.

  • DatabaseClient.runshell() теперь получает аргументы и дополнительный словарь с переменными среды для базового клиента командной строки из метода DatabaseClient.settings_to_cmd_args_env(). Сторонние базы данных должны реализовать DatabaseClient.settings_to_cmd_args_env() или переопределить DatabaseClient.runshell().

  • Сторонние базы данных должны реализовать поддержку функциональных индексов (Index.expressions) или установить для DatabaseFeatures.supports_expression_indexes значение False. Если COLLATE не является частью оператора CREATE INDEX, установите для DatabaseFeatures.collate_as_index_expression значение True.

django.contrib.admin

  • Ссылки на пагинацию в админке теперь индексируются с 1 вместо 0, т. е. строка запроса для первой страницы — ?p=1 вместо ?p=0.

  • Новое всеобъемлющее представление администратора будет разрушать шаблоны URL-адресов, маршрутизируемые после URL-адресов администратора и соответствующие префиксу URL-адреса администратора. Вы можете либо изменить порядок URL-адресов, либо, при необходимости, установить для AdminSite.final_catch_all_view значение False, отключив всеобъемлющее представление. См. Что нового в Джанго 3.2 для более подробной информации.

  • Минимизированные файлы JavaScript больше не входят в состав администратора. Если вам требуется минимизировать эти файлы, рассмотрите возможность использования стороннего приложения или внешнего инструмента сборки. Минимизированные файлы JavaScript, упакованные вместе с администратором (например, jquery.min.js), по-прежнему включены.

  • ModelAdmin.prepopulated_fields больше не удаляет английские стоп-слова, такие как 'a' или 'an'.

django.contrib.gis

  • Поддержка PostGIS 2.2 удалена.

  • Серверная часть Oracle теперь клонирует полигоны (и коллекции геометрии, содержащие полигоны) перед их переориентацией и сохранением в базе данных. Они больше не мутируют на месте. Вы можете заметить это, если используете полигоны после сохранения модели.

Прекращена поддержка PostgreSQL 9.5.

Поддержка исходной версии PostgreSQL 9.5 заканчивается в феврале 2021 года. Django 3.2 поддерживает PostgreSQL 9.6 и выше.

Прекращена поддержка MySQL 5.6.

Окончание основной поддержки MySQL 5.6 — апрель 2021 года. Django 3.2 поддерживает MySQL 5.7 и выше.

Разнообразный

  • Django теперь поддерживает часовые пояса, отличные от pytz, такие как модуль zoneinfo Python 3.9+ и его резервный порт.

  • Недокументированный метод SpatiaLiteOperations.proj4_version() переименован в proj_version().

  • slugify() теперь удаляет начальные и конечные тире и подчеркивания.

  • Фильтры шаблонов intcomma и intword больше не зависят от настройки USE_L10N.

  • Поддержка argon2-cffi < 19.1.0 удалена.

  • Ключи кэша больше не включают язык, когда интернационализация отключена (USE_I18N = False) и включена локализация (USE_L10N = True). После обновления до Django 3.2 в таких конфигурациях первый запрос к любому ранее кэшированному значению будет промахом в кэше.

  • ForeignKey.validate() теперь использует _base_manager вместо _default_manager для проверки существования связанных экземпляров.

  • Когда приложение определяет подкласс AppConfig в подмодуле apps.py, Django теперь автоматически использует эту конфигурацию, даже если она не включена с помощью default_app_config. Установите default = False в подклассе AppConfig, если вам нужно предотвратить такое поведение. См. Что нового в Джанго 3.2 для более подробной информации.

  • Создание экземпляра абстрактной модели теперь вызывает ошибку TypeError.

  • Аргументы ключевых слов для setup_databases() теперь содержат только ключевые слова.

  • Недокументированная функция django.utils.http.limited_parse_qsl() удалена. Вместо этого используйте urllib.parse.parse_qsl().

  • django.test.utils.TestContextDecorator теперь использует addCleanup(), так что очистки, зарегистрированные в методе setUp(), вызываются перед TestContextDecorator.disable().

  • SessionMiddleware теперь вызывает исключение SessionInterrupted вместо SuspiciousOperation, когда сеанс уничтожается в параллельном запросе.

  • Оператор равенства django.db.models.Field теперь правильно различает унаследованные экземпляры полей между моделями. Кроме того, теперь определен порядок таких полей.

  • Недокументированная функция django.core.files.locks.lock() теперь возвращает False, если файл не может быть заблокирован, вместо вызова BlockingIOError.

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

  • Команда makemessages больше не обрабатывает неверные локали, указанные с помощью опции makemessages --locale, если они содержат дефисы ('-').

  • Поле формы django.contrib.auth.forms.ReadOnlyPasswordHashField теперь по умолчанию имеет значение disabled. Поэтому UserChangeForm.clean_password() больше не требуется для возврата исходного значения.

  • Операции кэша cache.get_many(), get_or_set(), has_key(), incr(), decr(), incr_version() и decr_version() теперь правильно обрабатывают None, хранящееся в кэше, так же, как и любое другое значение, вместо того, чтобы вести себя так, как будто ключ не существует.

    Из-за ограничения python-memcached предыдущее поведение сохраняется для устаревшего бэкенда MemcachedCache.

  • Минимальная поддерживаемая версия SQLite увеличена с 3.8.3 до 3.9.0.

  • CookieStorage теперь хранит сообщения в формате, совместимом с RFC 6265. Поддержка файлов cookie старого формата сохраняется до версии Django 4.1.

  • Минимальная поддерживаемая версия asgiref увеличена с 3.2.10 до 3.3.2.

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

Разнообразный

  • Назначение объектов, которые не поддерживают создание глубоких копий с помощью copy.deepcopy(), атрибутам класса в TestCase.setUpTestData(), устарело.

  • Использование логического значения в BaseCommand.requires_system_checks устарело. Используйте '__all__' вместо True и [] (пустой список) вместо False.

  • Аргумент whitelist и атрибут domain_whitelist EmailValidator устарели. Используйте «allowlist» вместо «whitelist» и «domain_allowlist» вместо «domain_whitelist». Возможно, вам придется переименовать «белый список» в существующих миграциях.

  • Переменная конфигурации приложения default_app_config устарела из-за автоматического обнаружения AppConfig. См. Что нового в Джанго 3.2 для более подробной информации.

  • Автоматический вызов repr() для набора запросов в TransactionTestCase.assertQuerysetEqual() при сравнении со строковыми значениями устарел. Если вам нужно предыдущее поведение, явно установите для параметра Transform значение repr.

  • Серверная часть django.core.cache.backends.memcached.MemcachedCache устарела, так как python-memcached имеет некоторые проблемы и, похоже, не поддерживается. Вместо этого используйте django.core.cache.backends.memcached.PyMemcacheCache или django.core.cache.backends.memcached.PyLibMCCache.

  • Формат сообщений, используемый django.contrib.messages.storage.cookie.CookieStorage, отличается от формата, созданного более старыми версиями Django. Поддержка старого формата сохраняется до Django 4.1.

Back to Top