Примечания к выпуску 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. Поле модели поддерживает интроспекцию, 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
¶
- Новая опция
remove_stale_contenttypes --include-stale-apps
позволяет удалить устаревшие типы содержимого из ранее установленных приложений, которые были удалены изINSTALLED_APPS
.
django.contrib.gis
¶
- Поиск
relate
теперь поддерживается на MariaDB. - Добавлено свойство
LinearRing.is_counterclockwise
. AsGeoJSON
теперь поддерживается на Oracle.- Добавлены функции
AsWKB
иAsWKT
. - Добавлена поддержка PostGIS 3 и GDAL 3.
django.contrib.humanize
¶
- Фильтр шаблона
intword
теперь поддерживает отрицательные целые числа.
django.contrib.postgres
¶
- Новый класс
BloomIndex
позволяет создавать индексыbloom
в базе данных. Новая операция миграцииBloomExtension
устанавливает расширениеbloom
для добавления поддержки этого индекса. get_FOO_display()
теперь поддерживаетArrayField
иRangeField
.- Новые поиски
rangefield.lower_inc
,rangefield.lower_inf
,rangefield.upper_inc
иrangefield.upper_inf
позволяют запрашиватьRangeField
по связанному типу. rangefield.contained_by
теперь поддерживаетSmallAutoField
,AutoField
,BigAutoField
,SmallIntegerField
иDecimalField
.SearchQuery
теперь поддерживает тип поиска'websearch'
на PostgreSQL 11+.SearchQuery.value
теперь поддерживает выражения запросов.- Новый класс
SearchHeadline
позволяет выделять результаты поиска. - Поиск
search
теперь поддерживает выражения запросов. - Новый параметр
cover_density
SearchRank
позволяет ранжировать по плотности покрова. - Новый параметр
normalization
SearchRank
позволяет нормализовать ранг. - Новый атрибут
ExclusionConstraint.deferrable
позволяет создавать откладываемые ограничения исключения.
django.contrib.sessions
¶
- Настройка
SESSION_COOKIE_SAMESITE
теперь позволяет'None'
(строковое значение) явно указать, что cookie отправляется со всеми односайтовыми и межсайтовыми запросами.
django.contrib.staticfiles
¶
- Настройка
STATICFILES_DIRS
теперь поддерживаетpathlib.Path
.
Кэш¶
- Декоратор
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 отправляется со всеми односайтовыми и межсайтовыми запросами.
Електронна пошта¶
- Настройка
EMAIL_FILE_PATH
, используемая file email backend, теперь поддерживаетpathlib.Path
.
Отчеты об ошибках¶
django.views.debug.SafeExceptionReporterFilter
теперь фильтрует чувствительные значения изrequest.META
в отчетах об исключениях.- Новые атрибуты
SafeExceptionReporterFilter.cleansed_substitute
иSafeExceptionReporterFilter.hidden_settings
позволяют настраивать чувствительные параметры иrequest.META
фильтровать в отчетах об исключениях. - В представлении отладки Technical 404 теперь соблюдается
DEFAULT_EXCEPTION_REPORTER_FILTER
при применении фильтрации настроек. - Новый
DEFAULT_EXCEPTION_REPORTER
позволяет предоставить подклассdjango.views.debug.ExceptionReporter
для настройки генерации отчета об исключениях. Подробности см. в разделе Пользовательские отчеты об ошибках.
Хранение файлов¶
- Метод
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 теперь помечены как
deterministic
на Python 3.8+. Это позволяет использовать их в проверочных ограничениях и частичных индексах. - Новый атрибут
UniqueConstraint.deferrable
позволяет создавать откладываемые уникальные ограничения.
Запросы и ответы¶
- Если
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
позволяет отключить миграции во время создания тестовой базы данных. DiscoverRunner
теперь можно отменить вывод для прохождения тестов, используя опциюtest --buffer
.DiscoverRunner
теперь пропускает выполнение системных проверок для баз данных не referenced by tests.TransactionTestCase
teardown теперь быстрее на MySQL благодаря улучшению командыflush
. В качестве побочного эффекта последняя больше не сбрасывает автоматически последовательности при сносе. ВключитеTransactionTestCase.reset_sequences
, если ваши тесты требуют этой возможности.
URLs¶
- Path converters теперь может поднимать
ValueError
вto_url()
, чтобы указать на отсутствие совпадения при реверсировании URL.
Утилиты¶
filepath_to_uri()
теперь поддерживаетpathlib.Path
.parse_duration()
теперь поддерживает разделители-запятые для десятичных дробей в формате ISO 8601.parse_datetime()
,parse_duration()
иparse_time()
теперь поддерживают разделители-запятые для миллисекунд.
Разное¶
- Бэкенд 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 первый запрос к любому ранее кэшированному фрагменту шаблона будет пропуском кэша. - Логика принятия решения о возврате обратного перенаправления или HTTP-ответа 204 из представления
set_language()
теперь основана на HTTP-заголовкеAccept
вместо наличия HTTP-заголовкаX-Requested-With
. - Импорт совместимости
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
.
Новые JSONField
s, 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, blank=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
удалена.