Примечания к выпуску 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.Permissions, которые также будут удалены. Ранее перечислялись только типы содержимого (и эта подсказка была после команды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_Oracle5.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_labels аргументы теперь ограничивают вывод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теперь возвращаетnamedtuples вместо словарей, так что вы можете распаковать объект группы непосредственно в цикле, например,{% 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
This works similar to settings.TIME_ZONE = None except that it also sets
os.environ['TZ']. Let us know
if there’s a use case where you find you can’t adapt your code to set a
TIME_ZONE.
Изменения HTML в шаблонах администратора¶
<p class="help"> заменяется на тег <div>, что позволяет включать списки в текст справки.
Поля только для чтения обернуты в <div class="readonly">...</div> вместо <p>...</p>, что позволяет использовать любой HTML в качестве содержимого поля.
Изменения, связанные с внедрением рендеринга виджетов на основе шаблонов¶
Удалены некоторые недокументированные классы в django.forms.widgets:
SubWidgetRendererMixin,ChoiceFieldRenderer,RadioFieldRenderer,CheckboxFieldRendererChoiceInput,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_contextcontrib.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(). Методы, не принимающие этот аргумент, будут работать через период устаревания.