Примечания к выпуску 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
¶
- Новая опция
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
lookup теперь поддерживает выражения запросов.- Новый параметр
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 теперь помечены как :py<<<0 >>> на 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
позволяет отключить миграции во время создания тестовой базы данных. - Бегунок тестирования Django теперь поддерживает опцию
test --buffer
для отбрасывания вывода для пройденных тестов. DiscoverRunner
теперь пропускает выполнение системных проверок для баз данных, не referenced by tests.TransactionTestCase
teardown теперь быстрее на MySQL благодаря улучшению командыflush
. В качестве побочного эффекта последняя больше не сбрасывает автоматически последовательности при сносе. ВключитеTransactionTestCase.reset_sequences
, если ваши тесты требуют этой возможности.
URL-адреса¶
- 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 первый запрос к любому ранее кэшированному фрагменту шаблона будет пропуском кэша. - Логика решения о возврате отката перенаправления или ответа 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
.
Новые 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)
.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
.