• 3.2
  • 5.0
  • 6.1
  • Версия документации: 3.1

Примечания к выпуску Django 1.11

4 апреля 2017 г.

Добро пожаловать в Джанго 1.11!

Эти примечания к выпуску охватывают новые функции, а также некоторые обратно несовместимые изменения, о которых вам следует знать при обновлении с Django 1.10 или более ранних версий. Мы начали процесс прекращения поддержки некоторых функций.

См. руководство Upgrading Django to a newer version, если вы обновляете существующий проект.

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.

The Index class creates a b-tree index, as if you used db_index on the model field or index_together on the model Meta class. It can be subclassed to support different index types, such as GinIndex. It also allows defining the order (ASC/DESC) for the columns of the index.

Рендеринг виджетов на основе шаблонов

Чтобы упростить настройку виджетов, рендеринг виджетов форм теперь выполняется с использованием системы шаблонов, а не в 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 в базе данных.

  • JSONField accepts a new encoder parameter to specify a custom class to encode data types not supported by the standard encoder.

  • The new CIText mixin and CITextExtension migration operation allow using PostgreSQL’s citext extension for case-insensitive lookups. Three fields are provided: CICharField, CIEmailField, and 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() now uses server-side cursors on PostgreSQL. This feature transfers some of the worker memory load (used to hold query results) to the database and might increase database memory usage.

  • Добавлена ​​поддержка 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.

Модели

  • Добавлена ​​поддержка вызываемых значений в аргументе 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().

  • Добавлена ​​поддержка выражений запроса при поиске, которые принимают несколько аргументов, например «диапазон».

  • Теперь вы можете использовать опцию unique=True с FileField.

  • Добавлены параметры nulls_first и nulls_last в Expression.asc() и desc() для управления порядком нулевых значений.

  • Новые методы выражения 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 теперь возвращает 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(), если вы хотите его отключить.

Валидаторы

Изменения обратной несовместимости в версии 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.

Support for settings.TIME_ZONE = None is removed as the behavior isn’t commonly used and is questionably useful. If you want to automatically detect the timezone based on the system timezone, you can use 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 удалены:

  • Субвиджет

  • 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, 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, а не XHTML checked='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

Разнообразный

  • Функциональные представления 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(). Методы, которые не принимают этот аргумент, будут работать в течение периода устаревания.

Back to Top