Примечания к выпуску Django 1.11¶
Апрель 4, 2017
Добро пожаловать в Django 1.11!
Эти заметки о выпуске охватывают new features, а также некоторые backwards incompatible changes, о которых вы должны знать при переходе с Django 1.10 или более старых версий. Мы begun the deprecation process for some features.
См. руководство Обновление Django до более новой версии, если вы обновляете существующий проект.
Django 1.11 обозначен как long-term support release. Она будет получать обновления безопасности в течение как минимум трех лет после выпуска. Поддержка предыдущей LTS, Django 1.8, закончится в апреле 2018 года.
Совместимость с Python¶
Django 1.11 требует Python 2.7, 3.4, 3.5, 3.6 или 3.7 (по состоянию на 1.11.17). Мы настоятельно рекомендуем и официально поддерживаем только последний выпуск каждой серии.
Серия Django 1.11.x является последней, поддерживающей Python 2. Следующий основной выпуск, Django 2.0, будет поддерживать только Python 3.4+.
Амортизирующие предупреждения больше не являются громкими по умолчанию¶
В отличие от старых версий Django, собственные предупреждения об износе в Django больше не отображаются по умолчанию. Это соответствует поведению Python по умолчанию.
Это изменение позволяет сторонним приложениям поддерживать как Django 1.11 LTS, так и Django 1.8 LTS без необходимости добавлять код, чтобы избежать предупреждений об устаревании.
После выхода Django 2.0 мы предлагаем авторам сторонних приложений отказаться от поддержки всех версий Django, предшествующих 1.11. В это время вы должны иметь возможность запускать тесты вашего пакета, используя python -Wd
, чтобы предупреждения об устаревании не появлялись. После исправления предупреждений об износе ваше приложение должно быть совместимо с Django 2.0.
Что нового в Django 1.11¶
Модельные индексы на основе классов¶
Новый модуль django.db.models.indexes
содержит классы, облегчающие создание индексов базы данных. Индексы добавляются к моделям с помощью опции Meta.indexes
.
Класс Index
создает индекс b-дерева, как если бы вы использовали db_index
на поле модели или index_together
на модели Meta
. Он может быть подклассифицирован для поддержки различных типов индексов, например GinIndex
. Он также позволяет определить порядок (ASC/DESC) для столбцов индекса.
Рендеринг виджетов на основе шаблонов¶
Чтобы облегчить настройку виджетов, рендеринг виджетов формы теперь осуществляется с помощью системы шаблонов, а не на языке Python. См. API рендеринга форм.
Возможно, вам придется скорректировать любые пользовательские виджеты, которые вы написали для нескольких backwards incompatible changes.
Subquery
выражения¶
Новые выражения базы данных Subquery
и Exists
позволяют создавать явные подзапросы. Подзапросы могут ссылаться на поля из внешнего набора запросов с помощью класса OuterRef
.
Незначительные особенности¶
django.contrib.admin
¶
ModelAdmin.date_hierarchy
теперь может ссылаться на поля в разных отношениях.- Новый хук
ModelAdmin.get_exclude()
позволяет указать исключаемые поля на основе запроса или экземпляра модели. - Шаблон
popup_response.html
теперь может быть переопределен для каждого приложения, для каждой модели или путем установки атрибутаModelAdmin.popup_response_template
.
django.contrib.auth
¶
- Количество итераций по умолчанию для хешера паролей PBKDF2 увеличено на 20%.
- Представления
LoginView
иLogoutView
на основе классов заменяют устаревшие представленияlogin()
иlogout()
на основе функций. - Представления на основе классов
PasswordChangeView
,PasswordChangeDoneView
,PasswordResetView
,PasswordResetDoneView
,PasswordResetConfirmView
иPasswordResetCompleteView
заменяют устаревшие представления на основе функцийpassword_change()
,password_change_done()
,password_reset()
,password_reset_done()
,password_reset_confirm()
иpassword_reset_complete()
. - Новый атрибут
post_reset_login
дляPasswordResetConfirmView
позволяет автоматически регистрировать пользователя после успешного сброса пароля. Если у вас настроено несколькоAUTHENTICATION_BACKENDS
, используйте атрибутpost_reset_login_backend
, чтобы выбрать, какой из них использовать. - Чтобы избежать возможности утечки маркера сброса пароля через заголовок HTTP Referer (например, если страница сброса содержит ссылку на CSS или JavaScript, размещенные на другом домене),
PasswordResetConfirmView
(но не устаревшее представление на основе функцииpassword_reset_confirm()
) хранит маркер в сессии и перенаправляет на себя, чтобы представить пользователю форму изменения пароля без маркера в URL. update_session_auth_hash()
теперь поворачивает сессионный ключ, чтобы смена пароля аннулировала украденные сессионные cookies.- Новый атрибут
success_url_allowed_hosts
дляLoginView
иLogoutView
позволяет указать набор хостов, безопасных для перенаправления после входа и выхода из системы. - Добавлены валидаторы паролей
help_text
кUserCreationForm
. - Теперь
HttpRequest
передается вauthenticate()
, который в свою очередь передает его бэкенду аутентификации, если он принимает аргументrequest
. - Сигнал
user_login_failed()
теперь получает аргументrequest
. PasswordResetForm
поддерживает пользовательские модели пользователей, которые используют поле электронной почты с именем, отличным от'email'
. УстановитеCustomUser.EMAIL_FIELD
на имя поля.get_user_model()
теперь можно вызывать во время импорта, даже в модулях, определяющих модели.
django.contrib.contenttypes
¶
- При обнаружении устаревших типов содержимого в команде
remove_stale_contenttypes
теперь есть список связанных объектов, таких какauth.Permission
s, которые также будут удалены. Ранее перечислялись только типы содержимого (и эта подсказка была после командыmigrate
, а не в отдельной команде).
django.contrib.gis
¶
- Новые методы
GEOSGeometry.from_gml()
иOGRGeometry.from_gml()
позволяют создавать геометрии из GML. - Добавлена поддержка поиска
dwithin
в SpatiaLite. - Функция
Area
, функцияDistance
и поиск расстояний теперь работают с геодезическими координатами на SpatiaLite. - Виджеты форм на основе OpenLayers теперь используют
OpenLayers.js
изhttps://cdnjs.cloudflare.com
, который больше подходит для производственного использования, чем старый источникhttps://openlayers.org/
. Они также обновлены для использования OpenLayers 3. - Миграции PostGIS теперь могут изменять размеры полей.
- Добавлена возможность передавать параметры
size
,shape
иoffset
при создании объектовGDALRaster
. - Добавлена поддержка SpatiaLite для функции
IsValid
, функцииMakeValid
и поискаisvalid
. - Добавлена поддержка Oracle для функций
AsGML
,BoundingCircle
,IsValid
иisvalid
.
django.contrib.postgres
¶
- Новый аргумент
distinct
дляStringAgg
определяет, будут ли конкатенированные значения различаться. - Новые классы
GinIndex
иBrinIndex
позволяют создаватьGIN
иBRIN
индексы в базе данных. JSONField
принимает новый параметрencoder
для указания пользовательского класса для кодирования типов данных, не поддерживаемых стандартным кодировщиком.- Новый миксин
CIText
и операция миграцииCITextExtension
позволяют использовать расширение PostgreSQLcitext
для поиска без учета регистра. Предусмотрено три поля:CICharField
,CIEmailField
иCITextField
. - Новый
JSONBAgg
позволяет агрегировать значения в виде массива JSON. HStoreField
(поле модели) иHStoreField
(поле формы) позволяют хранить нулевые значения.
Кэш¶
- Бэкенды Memcached теперь передают содержимое
OPTIONS
в качестве аргументов ключевых слов в конструкторы клиента, что позволяет более детально контролировать поведение клиента. Примеры смотрите в документации по cache arguments. - Бэкенды Memcached теперь позволяют определять несколько серверов в виде строки, разделенной запятыми в
LOCATION
, для удобства работы со сторонними сервисами, которые используют такие строки в переменных окружения.
CSRF¶
- Добавлена настройка
CSRF_USE_SESSIONS
, позволяющая хранить CSRF-токен в сессии пользователя, а не в cookie.
Бэкенды баз данных¶
- Добавлен аргумент
skip_locked
кQuerySet.select_for_update()
на PostgreSQL 9.5+ и Oracle для выполнения запросов сFOR UPDATE SKIP LOCKED
. - Добавлена настройка
TEST['TEMPLATE']
, позволяющая пользователям PostgreSQL указывать шаблон для создания тестовой базы данных. QuerySet.iterator()
теперь использует server-side cursors на PostgreSQL. Эта функция переносит часть нагрузки рабочей памяти (используемой для хранения результатов запроса) на базу данных и может увеличить использование памяти базы данных.- Добавлена поддержка MySQL для опции
'isolation_level'
вOPTIONS
, позволяющая указывать transaction isolation level. Чтобы избежать возможной потери данных, рекомендуется перейти с уровня MySQL по умолчанию, повторяющегося чтения, на чтение с фиксацией. - Добавлена поддержка
cx_Oracle
5.3.
Электронная почта¶
- Добавлена настройка
EMAIL_USE_LOCALTIME
, позволяющая отправлять заголовки даты SMTP в местном часовом поясе, а не в UTC. EmailMessage.attach()
иattach_file()
теперь возвращаются к MIME-типу application/octet-stream, когда двоичное содержимое, которое не может быть декодировано как UTF-8, указано для text/* вложения.
Хранение файлов¶
- Чтобы сделать его оборачиваемым
io.TextIOWrapper
,File
теперь имеет методыreadable()
,writable()
иseekable()
.
Формы¶
- Новый атрибут
empty_value
дляCharField
,EmailField
,RegexField
,SlugField
иURLField
позволяет указать значение Python для представления «пусто». - Новый метод
Form.get_initial_for_field()
возвращает начальные данные для поля формы.
Интернационализация¶
- Форматирование чисел и настройка
NUMBER_GROUPING
поддерживают неравномерную группировку цифр.
Команды управления¶
- Новая опция
loaddata --exclude
позволяет исключить модели и приложения при загрузке данных из приспособлений. - Новая опция
diffsettings --default
позволяет указать модуль настроек, отличный от настроек Django по умолчанию, с которым будет проводиться сравнение. app_label
s аргументы теперь ограничивают выводshowmigrations --plan
.
Миграции¶
- Добавлена поддержка сериализации объектов
uuid.UUID
.
Модели¶
- Добавлена поддержка вызываемых значений в аргументе
defaults
вQuerySet.update_or_create()
иget_or_create()
. ImageField
теперь имеет валидатор по умолчаниюvalidate_image_file_extension
. (Этот валидатор переместился в поле формы в Django 1.11.2).- Добавлена поддержка усечения времени в функции
Trunc
. - Добавлена функция
ExtractWeek
для извлечения недели изDateField
иDateTimeField
и выставления ее через поискweek
. - Добавлена функция
TruncTime
для усеченияDateTimeField
до его временной составляющей и раскрытия его через поискtime
. - Добавлена поддержка выражений в
QuerySet.values()
иvalues_list()
. - Добавлена поддержка выражений запросов для поиска, принимающих несколько аргументов, таких как
range
. - Теперь вы можете использовать опцию
unique=True
сFileField
. - Добавлены параметры
nulls_first
иnulls_last
кExpression.asc()
иdesc()
для управления упорядочиванием нулевых значений. - Новые методы
F
выражениеbitleftshift()
иbitrightshift()
позволяют bitwise shift operations. - Добавлены
QuerySet.union()
,intersection()
иdifference()
.
Запросы и ответы¶
- Добавлено
QueryDict.fromkeys()
. CommonMiddleware
теперь устанавливает заголовок ответаContent-Length
для непотоковых ответов.- Добавлена настройка
SECURE_HSTS_PRELOAD
, позволяющая добавлять директивуpreload
к заголовкуStrict-Transport-Security
. ConditionalGetMiddleware
теперь добавляет заголовокETag
к ответам.
Сериализация¶
- Новый атрибут
django.core.serializers.base.Serializer.stream_class
позволяет подклассам настраивать поток по умолчанию. - Кодер, используемый функцией JSON serializer, теперь можно настроить, передав аргумент с ключевым словом
cls
в функциюserializers.serialize()
. DjangoJSONEncoder
теперь сериализует объектыtimedelta
(используемыеDurationField
).
Шаблоны¶
mark_safe()
теперь можно использовать в качестве декоратора.- Бэкенд шаблона
Jinja2
теперь поддерживает контекстные процессоры путем установки опции'context_processors'
вOPTIONS
. - Тег
regroup
теперь возвращаетnamedtuple
s вместо словарей, так что вы можете распаковать объект группы непосредственно в цикле, например,{% for grouper, list in regrouped %}
. - Добавлен тег шаблона
resetcycle
, позволяющий сбросить последовательность тега шаблонаcycle
. - Теперь вы можете указать конкретные каталоги для определенного
filesystem.Loader
.
Тесты¶
- Добавлено
DiscoverRunner.get_test_runner_kwargs()
для возможности настройки аргументов ключевых слов, передаваемых в программу запуска тестов. - Добавлена опция
test --debug-mode
для облегчения поиска неисправностей при тестировании путем установки параметраDEBUG
в значениеTrue
. - Новые функции
django.test.utils.setup_databases()
(перенесены изdjango.test.runner
) иteardown_databases()
облегчают создание пользовательских прогонов тестов. - Добавлена поддержка
unittest.TestCase.subTest()
при использовании опцииtest --parallel
. DiscoverRunner
теперь запускает системные проверки в начале выполнения теста. Переопределите методDiscoverRunner.run_checks()
, если вы хотите отключить его.
Валидаторы¶
- Добавлено
FileExtensionValidator
для проверки расширений файлов иvalidate_image_file_extension
для проверки файлов изображений.
Изменения в 1.11, несовместимые с обратными изменениями¶
django.contrib.gis
¶
- Для упрощения кодовой базы и потому, что его легче установить, чем когда
contrib.gis
был впервые выпущен, GDAL теперь является обязательной зависимостью для GeoDjango. В старых версиях она требовалась только для SQLite. contrib.gis.maps
удален, поскольку он взаимодействует с устаревшей версией API Google Maps и, похоже, не поддерживается. Если вы используете его, let us know.- Оператор равенства
GEOSGeometry
теперь также сравнивает SRID. - Виджеты форм на основе OpenLayers теперь используют OpenLayers 3, а шаблоны
gis/openlayers.html
иgis/openlayers-osm.html
были обновлены. Проверьте свой проект, если вы используете подклассы этих виджетов или расширяете шаблоны. Кроме того, новые виджеты работают немного иначе, чем старые. Вместо использования панели инструментов в виджете, вы нажимаете кнопку мыши, чтобы нарисовать, нажимаете и перетаскиваете, чтобы переместить карту, и нажимаете и перетаскиваете точку/вершину/угол, чтобы переместить ее. - Поддержка SpatiaLite < 4.0 прекращена.
- Поддержка GDAL 1.7 и 1.8 прекращена.
- Виджеты в
contrib.gis.forms.widgets
и админкеOpenLayersWidget
используют form rendering API, а неloader.render_to_string()
. Если вы используете пользовательский шаблон виджета, вам нужно убедиться, что ваш рендерер формы может его найти. Например, вы можете использовать рендерерTemplatesSetting
.
django.contrib.staticfiles
¶
collectstatic
теперь может не сработать во время постобработки при использовании хэшированного статического хранилища файлов, если существует цикл ссылок (например,'foo.css'
ссылается на'bar.css'
, который сам ссылается на'foo.css'
) или если цепочка файлов, ссылающихся на другие файлы, слишком глубока, чтобы разрешить ее за несколько проходов. В последнем случае увеличьте количество проходов, используяManifestStaticFilesStorage.max_post_process_passes
.- При использовании
ManifestStaticFilesStorage
статические файлы, не найденные в манифесте во время выполнения, теперь вызывают ошибкуValueError
вместо возврата неизменного пути. Вы можете вернуться к старому поведению, установивManifestStaticFilesStorage.manifest_strict
вFalse
.
API бэкенда базы данных¶
В этом разделе описаны изменения, которые могут потребоваться в бэкендах баз данных сторонних производителей.
- Метод
DatabaseOperations.time_trunc_sql()
добавлен для поддержки усеченияTimeField
. Он принимает аргументыlookup_type
иfield_name
и возвращает соответствующий SQL для усечения заданного поля времениfield_name
до объекта времени только с заданной спецификой. Аргументlookup_type
может быть либо'hour'
,'minute'
, либо'second'
. - Метод
DatabaseOperations.datetime_cast_time_sql()
добавлен для поддержки поискаtime
. Он принимает аргументыfield_name
иtzname
и возвращает SQL, необходимый для приведения значения времени к значению времени. - Чтобы включить поддержку
FOR UPDATE SKIP LOCKED
, установитеDatabaseFeatures.has_select_for_update_skip_locked = True
. - Новый атрибут
DatabaseFeatures.supports_index_column_ordering
указывает, позволяет ли база данных определять порядок для столбцов в индексах. Значение по умолчаниюTrue
, и методDatabaseIntrospection.get_constraints()
должен включать'orders'
ключ в каждый из возвращаемых словарей со списком'ASC'
и/или'DESC'
значений, соответствующих упорядочению каждого столбца в индексе. inspectdb
больше не вызываетDatabaseIntrospection.get_indexes()
, который является устаревшим. Пользовательские бэкенды баз данных должны убедиться, что все типы индексов возвращаются с помощьюDatabaseIntrospection.get_constraints()
.- Переименовали функцию
ignores_quoted_identifier_case
вignores_table_name_case
, чтобы более точно отразить, как она используется. - Аргумент с ключевым словом
name
добавлен к методуDatabaseWrapper.create_cursor(self, name=None)
, чтобы позволить использовать курсоры на стороне сервера на бэкендах, которые это поддерживают.
Прекращена поддержка PostgreSQL 9.2 и PostGIS 2.0¶
Поддержка PostgreSQL 9.2 заканчивается в сентябре 2017 года. Как следствие, Django 1.11 устанавливает PostgreSQL 9.3 в качестве минимальной версии, которую он официально поддерживает.
Поддержка PostGIS 2.0 также удалена, поскольку PostgreSQL 9.2 является последней версией, поддерживающей его.
Кроме того, минимальная поддерживаемая версия psycopg2 увеличена с 2.4.5 до 2.5.4.
LiveServerTestCase
привязка к нулевому порту¶
Вместо того чтобы брать диапазон портов и итеративно искать свободный порт, LiveServerTestCase
привязывается к нулевому порту и полагается на то, что операционная система назначит свободный порт. Переменная окружения DJANGO_LIVE_TEST_SERVER_ADDRESS
больше не используется, и поскольку она также больше не используется, опция manage.py test --liveserver
удалена.
Если вам нужно привязать LiveServerTestCase
к определенному порту, используйте атрибут port
, добавленный в Django 1.11.2.
Защита от небезопасных перенаправлений в представлениях django.contrib.auth
и i18n
¶
LoginView
, LogoutView
(и устаревшие эквиваленты на основе функций) и set_language()
защищают пользователей от перенаправления на URL, не относящиеся к HTTPS next
, когда приложение работает через HTTPS.
QuerySet.get_or_create()
и update_or_create()
подтверждают аргументы¶
Чтобы предотвратить молчаливое прохождение опечаток, get_or_create()
и update_or_create()
проверяют, что их аргументы являются полями модели. Это должно быть обратно несовместимо только в том смысле, что это может выявить ошибку в вашем проекте.
pytz
является необходимой зависимостью, а поддержка settings.TIME_ZONE = None
удалена¶
Чтобы упростить работу Django с часовыми поясами, pytz
теперь является обязательной зависимостью. Она автоматически устанавливается вместе с Django.
Поддержка settings.TIME_ZONE = None
удалена, так как это поведение не часто используется и сомнительно полезно. Если вы хотите автоматически определять часовой пояс на основе системного часового пояса, вы можете использовать tzlocal:
from tzlocal import get_localzone
TIME_ZONE = get_localzone().zone
Это работает аналогично settings.TIME_ZONE = None
, за исключением того, что оно также устанавливает os.environ['TZ']
. Let us know если в каком-то случае вы обнаружите, что не можете адаптировать свой код для установки TIME_ZONE
.
Изменения HTML в шаблонах администратора¶
<p class="help">
заменяется на тег <div>
, что позволяет включать списки в текст справки.
Поля только для чтения обернуты в <div class="readonly">...</div>
вместо <p>...</p>
, что позволяет использовать любой HTML в качестве содержимого поля.
Изменения, связанные с внедрением рендеринга виджетов на основе шаблонов¶
Удалены некоторые недокументированные классы в django.forms.widgets
:
SubWidget
RendererMixin
,ChoiceFieldRenderer
,RadioFieldRenderer
,CheckboxFieldRenderer
ChoiceInput
,RadioChoiceInput
,CheckboxChoiceInput
Недокументированный метод Select.render_option()
удален.
Метод Widget.format_output()
удален. Вместо него используйте пользовательский шаблон виджета.
Некоторые значения виджетов, такие как опции <select>
, теперь локализуются при settings.USE_L10N=True
. Вы можете вернуться к старому поведению с помощью пользовательских шаблонов виджетов, которые используют тег шаблона localize
для отключения локализации.
django.template.backends.django.Template.render()
запрещает недиктовый контекст¶
Для совместимости с различными шаблонизаторами, django.template.backends.django.Template.render()
(возвращаемый из высокоуровневых API загрузчика шаблонов, таких как loader.get_template()
) должен получать словарь контекста, а не Context
или RequestContext
. Если вы передавали один из этих двух классов, передайте вместо него словарь - это обеспечивает обратную совместимость со старыми версиями Django.
Изменение состояния модели в операциях миграции¶
Для повышения скорости применения миграций рендеринг связанных моделей откладывается до операции, которой они нужны (например, RunPython
). Если у вас есть пользовательская операция, которая работает с классами моделей или экземплярами моделей из аргумента from_state
в database_forwards()
или database_backwards()
, вы должны отрисовать состояния модели с помощью метода clear_delayed_apps_cache()
, как описано в writing your own migration operation.
Курсоры на стороне сервера в PostgreSQL¶
Изменение, заставляющее QuerySet.iterator()
использовать серверные курсоры на PostgreSQL, не позволяет запустить Django с PgBouncer в режиме пула транзакций. Чтобы разрешить это, используйте параметр DISABLE_SERVER_SIDE_CURSORS
(добавленный в Django 1.11.1) в DATABASES
.
Более подробное обсуждение см. в разделе Объединение транзакций и курсоры на стороне сервера.
Разное¶
Если ни один элемент в ленте не имеет атрибута
pubdate
илиupdateddate
,SyndicationFeed.latest_post_date()
теперь возвращает текущую дату/время UTC, а не время без информации о часовом поясе.Сбои CSRF регистрируются в журнале
django.security.csrf
вместоdjango.request
.Валидация
ALLOWED_HOSTS
больше не отключается при запуске тестов. Если ваше приложение включает тесты с пользовательскими именами хостов, вы должны включить эти имена хостов вALLOWED_HOSTS
. См. Тесты и несколько имен хостов.Использование id внешнего ключа (например,
'field_id'
) вModelAdmin.list_display
отображает ID связанного объекта. Удалите суффикс_id
, если вы хотите получить старое поведение строкового представления объекта.В формах моделей
CharField
сnull=True
теперь сохраняетNULL
для пустых значений вместо пустых строк.В Oracle,
Model.validate_unique()
больше не проверяет пустые строки на уникальность, так как база данных интерпретирует значение какNULL
.Если вы создаете подкласс
AbstractUser
и переопределяетеclean()
, убедитесь, что он вызываетsuper()
.BaseUserManager.normalize_email()
вызывается в новом методеAbstractUser.clean()
, чтобы нормализация применялась в таких случаях, как проверка формы модели.EmailField
иURLField
больше не принимают аргумент в виде ключевого словаstrip
. Удалите его, потому что он не имеет эффекта в старых версиях Django, так как эти поля всегда отделяют пробелы.Атрибуты
checked
иselected
, отображаемые виджетами форм, теперь используют синтаксис HTML5 boolean, а не XHTMLchecked='checked'
иselected='selected'
.RelatedManager.add()
,remove()
,clear()
иset()
теперь очищают кэшprefetch_related()
.Чтобы предотвратить возможную потерю сохраненных настроек,
setup_test_environment()
теперь вызывает исключение, если вызывается во второй раз до вызоваteardown_test_environment()
.Недокументированный псевдоним
DateTimeAwareJSONEncoder
дляDjangoJSONEncoder
(переименованный в Django 1.0) удален.Теперь
cached template loader
включается, если не указаноOPTIONS['loaders']
, аOPTIONS['debug']
-False
(последний параметр по умолчанию имеет значениеDEBUG
). Это может быть обратно несовместимо, если у вас есть некоторые template tags that aren’t thread safe.После выполнения команды
migrate
больше не появляется запрос на удаление устаревшего типа содержимого. Вместо нее используйте новую командуremove_stale_contenttypes
.Виджет администратора для
IntegerField
используетtype="number"
, а неtype="text"
.Условные HTTP-заголовки теперь анализируются и сравниваются в соответствии со спецификацией RFC 7232 условных запросов, а не со старой RFC 2616.
patch_response_headers()
больше не добавляет заголовокLast-Modified
. Согласно RFC 7234#section-4.2.2, этот заголовок бесполезен наряду с другими заголовками кэширования, которые предоставляют явное время истечения срока действия, например,Expires
илиCache-Control
.UpdateCacheMiddleware
иadd_never_cache_headers()
вызываютpatch_response_headers()
и поэтому также затронуты этим изменением.В шаблонах администратора тег
<p class="help">
заменен на тег<div>
, что позволяет включать списки в текст справки.ConditionalGetMiddleware
больше не устанавливает заголовокDate
, поскольку веб-серверы устанавливают этот заголовок. Он также больше не устанавливает заголовокContent-Length
, поскольку теперь это делаетCommonMiddleware
.Если у вас есть промежуточное ПО, которое изменяет содержимое ответа и появляется перед
CommonMiddleware
в настройкахMIDDLEWARE
илиMIDDLEWARE_CLASSES
, вы должны изменить порядок своего промежуточного ПО так, чтобы ответы не изменялись после установкиContent-Length
, или чтобы промежуточное ПО, изменяющее ответ, сбросило заголовокContent-Length
.get_model()
иget_models()
теперь вызывают ошибкуAppRegistryNotReady
, если они вызваны до того, как модели всех приложений были загружены. Ранее они требовали загрузки только моделей целевого приложения и, таким образом, могли возвращать модели без всех установленных отношений. Если вам нужно старое поведениеget_model()
, установите аргументrequire_ready
в значениеFalse
.Неиспользуемый атрибут
BaseCommand.can_import_settings
удаляется.Недокументированное
django.utils.functional.lazy_property
удалено.Для согласованности с запросами, не состоящими из нескольких частей,
MultiPartParser.parse()
теперь оставляетrequest.POST
неизменным. Если вы изменяетеQueryDict
, то теперь вы должны сначала скопировать его, например,request.POST.copy()
.Удалена поддержка
cx_Oracle
< 5.2.Из команды
shell
удалена поддержка IPython < 1.0.Подпись частного API
Widget.build_attrs()
изменена сextra_attrs=None, **kwargs
наbase_attrs, extra_attrs=None
.Файлоподобные объекты (например,
StringIO
иBytesIO
), загруженные вImageField
с помощью тестового клиента, теперь требуютname
атрибута со значением, которое проходитvalidate_image_file_extension
валидатор. См. примечание вClient.post()
.FileField
теперь перемещает, а не копирует полученный файл. При настройках загрузки файлов по умолчанию файлы размером болееFILE_UPLOAD_MAX_MEMORY_SIZE
теперь имеют те же разрешения, что и временные файлы (часто0o600
), а не стандартный umask системы (часто0o6644
). УстановитеFILE_UPLOAD_PERMISSIONS
, если вам нужно одинаковое разрешение независимо от размера файла.
Функции, устаревшие в версии 1.11¶
models.permalink()
декоратор¶
Вместо этого используйте django.urls.reverse()
. Например:
from django.db import models
class MyModel(models.Model):
...
@models.permalink
def url(self):
return ('guitarist_detail', [self.slug])
становится:
from django.db import models
from django.urls import reverse
class MyModel(models.Model):
...
def url(self):
return reverse('guitarist_detail', args=[self.slug])
Разное¶
- Представления
contrib.auth
на основе функцийlogin()
иlogout()
устарели в пользу новых представленийLoginView
иLogoutView
на основе классов. - Неиспользуемый параметр
extra_context
contrib.auth.views.logout_then_login()
является устаревшим. - Функциональные представления
contrib.auth
,password_change()
,password_change_done()
,password_reset()
,password_reset_done()
,password_reset_confirm()
иpassword_reset_complete()
устарели в пользу новых представлений на основе классовPasswordChangeView
,PasswordChangeDoneView
,PasswordResetView
,PasswordResetDoneView
,PasswordResetConfirmView
иPasswordResetCompleteView
. django.test.runner.setup_databases()
перемещается вdjango.test.utils.setup_databases()
. Старое расположение устарело.django.utils.translation.string_concat()
устарело в пользуdjango.utils.text.format_lazy()
.string_concat(*strings)
может быть заменено наformat_lazy('{}' * len(strings), *strings)
.- Для бэкенда кэша
PyLibMCCache
передача параметров поведенияpylibmc
в качестве атрибутов верхнего уровня вOPTIONS
устарела. Вместо этого задайте их под ключомbehaviors
внутриOPTIONS
. - Параметр
host
вdjango.utils.http.is_safe_url()
устарел в пользу нового параметраallowed_hosts
. - Глушение исключений, возникающих при рендеринге тега шаблона
{% include %}
, устарело, поскольку такое поведение часто больше запутывает, чем помогает. В Django 2.1 исключение будет подниматься. DatabaseIntrospection.get_indexes()
устарело в пользуDatabaseIntrospection.get_constraints()
.authenticate()
теперь передает аргументrequest
методуauthenticate()
бэкендов аутентификации. Поддержка методов, которые не принимаютrequest
в качестве первого позиционного аргумента, будет удалена в Django 2.1.- Настройка
USE_ETAGS
устарела в пользуConditionalGetMiddleware
, которая теперь добавляет заголовокETag
к ответам независимо от настройки.CommonMiddleware
иdjango.utils.cache.patch_response_headers()
больше не будут устанавливать ETags, когда устаревание закончится. Model._meta.has_auto_field
устарело в пользу проверки наличияModel._meta.auto_field is not None
.- Использование групп регулярных выражений с
iLmsu#
вurl()
является устаревшим. Единственной полезной группой является(?i)
для URL, не чувствительных к регистру, однако URL, не чувствительные к регистру, не являются хорошей практикой, поскольку они создают множество записей, например, для поисковых систем. Альтернативным решением может быть созданиеhandler404
, который ищет в URL символы верхнего регистра и перенаправляет на эквивалент в нижнем регистре. - Аргумент
renderer
добавляется к методуWidget.render()
. Методы, не принимающие этот аргумент, будут работать через период устаревания.