Примечания к выпуску Django 1.11¶
4 апреля 2017 г.
Добро пожаловать в Джанго 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. В это время вы сможете запускать тесты вашего пакета с помощью python -Wd, чтобы появлялись предупреждения об устаревании. После исправления предупреждений об устаревании ваше приложение должно быть совместимо с Django 2.0.
Что нового в Джанго 1.11¶
Индексы моделей на основе классов¶
Новый модуль django.db.models.indexes содержит классы, упрощающие создание индексов базы данных. Индексы добавляются в модели с помощью опции Meta.indexes.
Класс Index создает индекс b-дерева, как если бы вы использовали db_index в поле модели или index_together в классе модели Meta. Его можно разделить на подклассы для поддержки различных типов индексов, например GinIndex. Это также позволяет определить порядок (ASC/DESC) для столбцов индекса.
Рендеринг виджетов на основе шаблонов¶
Чтобы упростить настройку виджетов, рендеринг виджетов форм теперь выполняется с использованием системы шаблонов, а не в Python. См. API рендеринга формы.
Возможно, вам придется настроить любые пользовательские виджеты, которые вы написали, с учетом нескольких обратно несовместимых изменений.
Выражения Подзапрос¶
Новые выражения базы данных 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()теперь меняет сеансовый ключ, чтобы разрешить смену пароля, чтобы сделать недействительными украденные сеансовые файлы cookie.Новый атрибут Success_url_allowed_hosts для
LoginViewиLogoutViewпозволяет указать набор хостов, которые можно безопасно перенаправить после входа в систему и выхода из системы.В
UserCreationFormдобавлены валидаторы паролейhelp_text.HttpRequestтеперь передается вauthenticate(), который, в свою очередь, передает его в серверную часть аутентификации, если он принимает аргументrequest.Сигнал
user_login_failed()теперь получает аргументrequest.PasswordResetFormподдерживает пользовательские модели, которые используют поле электронной почты с именем, отличным от'email'. УстановитеCustomUser.EMAIL_FIELDв имя поля.get_user_model()теперь можно вызывать во время импорта, даже в модулях, определяющих модели.
django.contrib.contenttypes¶
Когда в команде
remove_stale_contenttypesобнаруживаются устаревшие типы контента, теперь существует список связанных объектов, таких какauth.Permissions, которые также будут удалены. Раньше в списке были указаны только типы контента (и это приглашение было после «мигрировать», а не в отдельной команде).
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, иневерныйпоиск.
django.contrib.postgres¶
Новый аргумент
distinctдляStringAggопределяет, будут ли объединенные значения различны.Новые классы
GinIndexиBrinIndexпозволяют создавать индексыGINиBRINв базе данных.django.contrib.postgres.fields.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()теперь использует серверные курсоры в PostgreSQL. Эта функция переносит часть нагрузки на рабочую память (используемую для хранения результатов запроса) в базу данных и может увеличить использование памяти базы данных.Добавлена поддержка MySQL для опции
'isolation_level'в :setting:``OPTIONS`, чтобы позволить указать уровень изоляции транзакции. Чтобы избежать возможной потери данных, рекомендуется переключиться с уровня MySQL по умолчанию, повторяемого чтения, на зафиксированное чтение.Добавлена поддержка cx_Oracle версии 5.3.
Электронная почта¶
Добавлен параметр
EMAIL_USE_LOCALTIME, позволяющий отправлять заголовки дат SMTP в местном часовом поясе, а не в формате UTC.EmailMessage.attach()иattach_file()теперь возвращаются к типу MIME application/octet-stream, когда для вложения text/* указан двоичный контент, который не может быть декодирован как UTF-8.
Хранение файлов¶
Чтобы сделать его обертываемым с помощью
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.
Модели¶
Добавлена поддержка вызываемых значений в аргументе
defaultsQuerySet.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().Добавлена поддержка выражений запроса при поиске, которые принимают несколько аргументов, например «диапазон».
Теперь вы можете использовать опцию unique=True с
FileField.Добавлены параметры
nulls_firstиnulls_lastвExpression.asc()иdesc()для управления порядком нулевых значений.Новые методы выражения
Fbitleftshift() и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теперь возвращаетnamedtuples вместо словарей, так что вы можете распаковать групповой объект непосредственно в цикле, например{% для группировщика, список в перегруппированном %}.Добавлен тег шаблона
resetcycle, позволяющий сбросить последовательность тега шаблонаcycle.Теперь вы можете указать определенные каталоги для конкретного
filesystem.Loader.
Тесты¶
Добавлен
DiscoverRunner.get_test_runner_kwargs(), позволяющий настраивать аргументы ключевого слова, передаваемые в программу запуска тестов.Добавлен параметр
test --debug-mode, который помогает устранять неполадки при тестировании, устанавливая для параметраDEBUGзначениеTrue.Новые функции
django.test.utils.setup_databases()(перемещены изdjango.test.runner) иteardown_databases()упрощают создание пользовательских средств запуска тестов.Добавлена поддержка
python:unittest.TestCase.subTest()при использовании опцииtest --parallel.DiscoverRunnerтеперь запускает проверку системы в начале тестового запуска. Переопределите методDiscoverRunner.run_checks(), если вы хотите его отключить.
Валидаторы¶
Добавлен
FileExtensionValidatorдля проверки расширений файлов иvalidate_image_file_extensionдля проверки файлов изображений.
Изменения обратной несовместимости в версии 1.11¶
django.contrib.gis¶
Чтобы упростить базу кода и потому, что ее проще установить, чем когда contrib.gis был впервые выпущен, ГДАЛ теперь является обязательной зависимостью для 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» может иметь значение «час», «минута» или «секунда».Добавлен метод
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-адреса next, отличные от HTTPS, когда приложение работает через 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']. Сообщите нам, если возникнет случай использования, в котором вы обнаружите, что не можете адаптировать свой код для установки TIME_ZONE.
Изменения HTML в шаблонах администратора¶
<p class="help"> заменяется тегом <div>, позволяющим включать списки в текст справки.
Поля, доступные только для чтения, заключаются в <div class="readonly">...</div> вместо <p>...</p>, чтобы разрешить любой тип HTML в качестве содержимого поля.
Изменения в связи с введением рендеринга виджетов на основе шаблонов.¶
Некоторые недокументированные классы в django.forms.widgets удалены:
СубвиджетRendererMixin,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(), как описано в написании собственной операции миграции.
Серверные курсоры в PostgreSQL¶
Изменение, позволяющее QuerySet.iterator() использовать серверные курсоры в PostgreSQL, предотвращает запуск Django с PgBouncer в режиме пула транзакций. Чтобы это реализовать, используйте настройку DISABLE_SERVER_SIDE_CURSORS (добавленную в Django 1.11.1) в DATABASES.
Дополнительную информацию см. в разделе Пул транзакций и курсоры на стороне сервера.
Разнообразный¶
Если ни один элемент в ленте не имеет атрибута
pubdateилиupdateddate,SyndictionFeed.latest_post_date()теперь возвращает текущую дату/время в формате UTC вместо даты и времени без какой-либо информации о часовом поясе.Ошибки 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, а не XHTMLchecked='checked'иselected='selected'.и
set()теперь очищает кешprefetch_related().Чтобы предотвратить возможную потерю сохраненных настроек,
setup_test_environment()теперь вызывает исключение, если вызывается второй раз перед вызовомteardown_test_environment().Недокументированный псевдоним DateTimeAwareJSONEncoder для
DjangoJSONEncoder(переименованный в Django 1.0) удален.кэшированный загрузчик шаблоновтеперь включен, еслиOPTIONS['loaders']не указан иOPTIONS['debug']имеет значениеFalse(последний параметр по умолчанию имеет значениеDEBUG). Это может быть обратно несовместимо, если у вас есть некоторые теги шаблона, которые не являются потокобезопасными, <template_tag_thread_safety>`.Запрос на удаление устаревшего типа контента больше не появляется после запуска команды
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, этот заголовок бесполезен наряду с другими заголовками кэширования, которые предоставляют явное время истечения срока действия, например.Истекаетили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 удалена.Поддержка 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])
Разнообразный¶
Функциональные представления
login()иlogout()вcontrib.authустарели в пользу новых представлений на основе классовLoginViewиLogoutView.Неиспользуемый параметр extra_context в contrib.auth.views.logout_then_login() устарел.
Представления на основе функций
password_change(),password_change_done(),password_reset(),password_reset_done(),password_reset_confirm()иpassword_reset_complete()вcontrib.authустарели в пользу новых представлений на основе классов.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()серверной части аутентификации. Поддержка методов, которые не принимают запрос в качестве первого позиционного аргумента, будет удалена в Django 2.1.Параметр
USE_ETAGSустарел в пользуConditionalGetMiddleware, который теперь добавляет заголовокETagк ответам независимо от настройки.CommonMiddlewareиdjango.utils.cache.patch_response_headers()больше не будут устанавливать ETags, когда устаревание закончится.Model._meta.has_auto_fieldустарел в пользу проверки того, чтоModel._meta.auto_field не имеет значения None.Использование групп регулярных выражений с
iLmsu#вurl()устарело. Единственная полезная группа — это(?i)для URL-адресов без учета регистра, однако URL-адреса без учета регистра не являются хорошей практикой, поскольку они создают, например, несколько записей для поисковых систем. Альтернативным решением может быть созданиеhandler404, который ищет символы верхнего регистра в URL-адресе и перенаправляет их на эквивалент в нижнем регистре.Аргумент
rendererдобавляется в методWidget.render(). Методы, которые не принимают этот аргумент, будут работать в течение периода устаревания.