Примечания к выпуску Django 1.11 ¶
4 апреля 2017 г.
Добро пожаловать в Django 1.11!
Эти примечания к выпуску охватывают новые функции , а также некоторые обратно несовместимые изменения, о которых вам нужно знать при обновлении с Django 1.10 или более старых версий. Мы начали процесс прекращения поддержки некоторых функций .
См. Руководство по обновлению Django до более новой версии, если вы обновляете существующий проект.
Django 1.11 обозначен как выпуск с долгосрочной поддержкой . Он будет получать обновления безопасности в течение как минимум трех лет после выпуска. Поддержка предыдущего 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. В то время вы должны иметь возможность запускать тесты вашего пакета с помощью, чтобы появлялись предупреждения об устаревании. После исправления предупреждений об устаревании ваше приложение должно быть совместимо с Django 2.0.python -Wd
Что нового в Django 1.11 ¶
Индексы моделей на основе классов ¶
Новый django.db.models.indexes
модуль содержит классы, упрощающие создание индексов базы данных. Индексы добавляются к моделям с помощью
Meta.indexes
опции.
Index
Класс создает индекс B-дерева, как если бы вы использовали db_index
на поле модели или
index_together
на модели Meta
класса. Его можно разделить на подклассы для поддержки различных типов индексов, например
GinIndex
. Это также позволяет определять порядок (ASC / DESC) для столбцов индекса.
Визуализация виджетов на основе шаблонов ¶
Чтобы упростить настройку виджетов, рендеринг виджетов формы теперь выполняется с использованием системы шаблонов, а не в Python. См . API отрисовки форм .
Возможно, вам придется настроить любые пользовательские виджеты, которые вы написали, для нескольких обратно несовместимых изменений .
Subquery
выражения ¶
Выражения new Subquery
и
Exists
database позволяют создавать явные подзапросы. Подзапросы могут ссылаться на поля из внешнего набора запросов с помощью 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()
теперь меняет ключ сеанса, чтобы разрешить изменение пароля для аннулирования украденных файлов cookie сеанса.- Новый
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
миграции позволяет использоватьcitext
расширение PostgreSQL для поиска без учета регистра. Предусмотрено три поля:CICharField
,CIEmailField
, иCITextField
. - Новое
JSONBAgg
позволяет агрегировать значения в виде массива JSON. HStoreField
(Модель поля) иHStoreField
(поле формы) позволяют хранить значения NULL.
Кэш ¶
- Бэкенды Memcached теперь передают содержимое
OPTIONS
аргументов в виде ключевых слов конструкторам клиента, что позволяет более эффективно управлять поведением клиента. Смотрите аргументы кэша документации на примерах. - Бэкенды 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()
теперь использует серверные курсоры в PostgreSQL. Эта функция передает часть нагрузки рабочей памяти (используемой для хранения результатов запроса) в базу данных и может увеличить использование памяти базы данных.- Добавлена поддержка MySQL для
'isolation_level'
опции,OPTIONS
позволяющей указать уровень изоляции транзакции . Чтобы избежать возможной потери данных, рекомендуется переключиться с уровня MySQL по умолчанию, повторяющееся чтение, на зафиксированное чтение. - Добавлена поддержка
cx_Oracle
5.3.
Электронная почта ¶
- Добавлен
EMAIL_USE_LOCALTIME
параметр, позволяющий отправлять заголовки даты SMTP в местном часовом поясе, а не в формате UTC. EmailMessage.attach()
иattach_file()
теперь возвращаемся к MIME-типу application / octet-stream, когда двоичный контент, который не может быть декодирован как UTF-8, указан для вложения text / * .
Файловое хранилище ¶
- Для того, чтобы сделать его wrappable путем
io.TextIOWrapper
, вFile
настоящее время имеетreadable()
,writable()
иseekable()
методы.
Формы ¶
- Новый
empty_value
атрибутCharField
,EmailField
,RegexField
,SlugField
, иURLField
позволяет задать значение Python использовать для представления «пустой». - Новый
Form.get_initial_for_field()
метод возвращает исходные данные для поля формы.
Интернационализация ¶
- Форматирование чисел и
NUMBER_GROUPING
настройка поддерживают неравномерную группировку цифр.
Команды управления ¶
- Новая опция позволяет исключать модели и приложения при загрузке данных из светильников.
loaddata --exclude
- Новая опция позволяет указать модуль настроек, отличный от настроек Django по умолчанию для сравнения.
diffsettings --default
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()
контролировать порядок значений NULL. - Новое
F
выражениеbitleftshift()
иbitrightshift()
методы позволяют выполнять операции побитового сдвига . - Добавлен
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,
теперь можно настроить, передав
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()
's при использовании опции.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 и, похоже, не поддерживается. Если вы его используете, дайте нам знать .- Оператор
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
используют 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 , необходимый для приведения значения DATETIME к значению времени.- Чтобы включить поддержку, установите
.
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()
защитить пользователей от перенаправлены без HTTPS next
URL , когда приложение работает над HTTPS.
QuerySet.get_or_create()
и update_or_create()
проверить аргументы ¶
Чтобы опечатки не передавались беззвучно,
get_or_create()
и
update_or_create()
убедитесь, что их аргументы являются полями модели. Это должно быть обратно несовместимым только в том случае, если оно может выявить ошибку в вашем проекте.
pytz
является необходимой зависимостью и поддержки удаляются ¶settings.TIME_ZONE = None
Чтобы упростить обработку часовых поясов в Django, pytz
теперь требуется зависимость. Он автоматически устанавливается вместе с Django.
Поддержка удалена, так как поведение обычно не используется и сомнительно полезно. Если вы хотите автоматически определять часовой пояс на основе системного часового пояса, вы можете использовать tzlocal :settings.TIME_ZONE = None
from tzlocal import get_localzone
TIME_ZONE = get_localzone().zone
Это работает аналогично, за исключением того, что он также устанавливает
. Сообщите нам,
если вы обнаружите, что не можете адаптировать свой код для установки файла
.settings.TIME_ZONE = None
os.environ['TZ']
TIME_ZONE
Изменения HTML в админских шаблонах ¶
<p class="help">
заменяется <div>
тегом, позволяющим включать списки в текст справки.
Поля только для чтения обернуты вместо того,
чтобы разрешить использование любого типа HTML в качестве содержимого поля.<div class="readonly">...</div>
<p>...</p>
Изменения в связи с введением рендеринга виджетов на основе шаблонов ¶
Некоторые недокументированные классы 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()
метод, как описано при написании вашей собственной операции миграции .
Курсоры на стороне сервера в PostgreSQL ¶
Изменение на QuerySet.iterator()
использование серверных курсоров в PostgreSQL предотвращает запуск Django с PgBouncer в режиме пула транзакций. Чтобы это допустить, используйте DISABLE_SERVER_SIDE_CURSORS
настройку (добавленную в Django 1.11.1) в
DATABASES
.
См. Раздел Объединение транзакций и курсоры на стороне сервера для более подробного обсуждения.
Разное ¶
Если ни один элемент в фиде не имеет атрибута
pubdate
илиupdateddate
,SyndicationFeed.latest_post_date()
теперь возвращается текущая дата / время в формате UTC, а не datetime без какой-либо информации о часовом поясе.Ошибки CSRF регистрируются в
django.security.csrf
регистраторе вместоdjango.request
.ALLOWED_HOSTS
проверка больше не отключается при запуске тестов. Если ваше приложение включает тесты с настраиваемыми именами хостов, вы должны включить эти имена хостов вALLOWED_HOSTS
. См. Тесты и несколько имен хостов .Использование идентификатора внешнего ключа (например
'field_id'
) вModelAdmin.list_display
отображает идентификатор связанного объекта. Удалите_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 булево синтаксис , а не XHTML - хchecked='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
Запрос на удаление устаревшего типа контента больше не появляется после выполнения
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()
callpatch_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 удалена.Поддержка IPython <1.0 удалена из
shell
команды.Подпись частного 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
), а не стандартную маску системы (часто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
«Slogin()
иlogout()
виды функций на основе осуждаются в пользу новых взглядов на основе классовLoginView
иLogoutView
.- Неиспользуемый
extra_context
параметрcontrib.auth.views.logout_then_login()
устарел. contrib.auth
«spassword_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
параметра.- Отключение звука исключений, возникающих при рендеринге
тега шаблона, не рекомендуется, поскольку такое поведение часто скорее сбивает с толку, чем помогает. В Django 2.1 возникнет исключение.
{% include %}
DatabaseIntrospection.get_indexes()
устарел в пользуDatabaseIntrospection.get_constraints()
.authenticate()
теперь передаетrequest
аргументauthenticate()
методу бэкэнда аутентификации. Поддержка методов, которые не принимаютсяrequest
в качестве первого позиционного аргумента, будет удалена в Django 2.1.- Этот
USE_ETAGS
параметр устарел, иConditionalGetMiddleware
теперь он добавляетETag
заголовок к ответам независимо от параметра.CommonMiddleware
иdjango.utils.cache.patch_response_headers()
больше не будет устанавливать ETag по окончании срока устаревания. Model._meta.has_auto_field
устарел в пользу проверки if .Model._meta.auto_field is not None
- Использование групп регулярных выражений с
iLmsu#
inurl()
не рекомендуется. Единственная полезная группа - это(?i)
URL-адреса без учета регистра, однако URL-адреса без учета регистра не являются хорошей практикой, поскольку они создают несколько записей, например, для поисковых систем. Альтернативным решением может быть создание объекта,handler404
который ищет символы в верхнем регистре в URL-адресе и перенаправляет их на эквивалент в нижнем регистре. renderer
Аргумент добавляется кWidget.render()
методу. Методы, которые не принимают этот аргумент, будут работать в течение периода устаревания.