Примечания к выпуску 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и Existsdatabase позволяют создавать явные подзапросы. Подзапросы могут ссылаться на поля из внешнего набора запросов с помощью 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.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миграции позволяет использовать 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_Oracle5.3.

Электронная почта

  • Добавлен EMAIL_USE_LOCALTIMEпараметр, позволяющий отправлять заголовки даты SMTP в местном часовом поясе, а не в формате UTC.
  • EmailMessage.attach()и attach_file()теперь возвращаемся к MIME-типу application / octet-stream, когда двоичный контент, который не может быть декодирован как UTF-8, указан для вложения text / * .

Файловое хранилище

  • Для того, чтобы сделать его wrappable путем io.TextIOWrapper, в Fileнастоящее время имеет readable(), writable()и seekable()методы.

Формы

Интернационализация

  • Форматирование чисел и 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Тег теперь возвращает namedtuples вместо словарей , так что вы можете распаковать объект группы непосредственно в цикле, например .{% for grouper, list in regrouped %}
  • Добавлен resetcycleтег шаблона, позволяющий сбросить последовательность cycleтега шаблона.
  • Теперь вы можете указать определенные каталоги для конкретного filesystem.Loader.

Тесты

  • Добавлено, DiscoverRunner.get_test_runner_kwargs()чтобы разрешить настройку аргументов ключевых слов, передаваемых средству выполнения тестов.
  • Добавлен параметр, помогающий устранять неполадки при тестировании, задав для параметра значение .test --debug-modeDEBUGTrue
  • Новые django.test.utils.setup_databases()(перенесенные из django.test.runner) teardown_databases() функции и упрощают создание пользовательских исполнителей тестов.
  • Добавлена ​​поддержка для unittest.TestCase.subTest()'s при использовании опции.test --parallel
  • DiscoverRunnerтеперь запускает системные проверки в начале пробного запуска. Переопределите DiscoverRunner.run_checks()метод, если хотите его отключить.

Валидаторы

Обратно несовместимые изменения в 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 LOCKEDDatabaseFeatures.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 nextURL , когда приложение работает над 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 = Noneos.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 loaderOPTIONS['loaders']OPTIONS['debug']FalseDEBUG

  • Запрос на удаление устаревшего типа контента больше не появляется после выполнения 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()call 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, **kwargsbase_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

Разное

  • contrib.auth«S login()и logout()виды функций на основе осуждаются в пользу новых взглядов на основе классов LoginViewи LogoutView.
  • Неиспользуемый extra_contextпараметр contrib.auth.views.logout_then_login() устарел.
  • contrib.auth«s 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параметра.
  • Отключение звука исключений, возникающих при рендеринге тега шаблона, не рекомендуется, поскольку такое поведение часто скорее сбивает с толку, чем помогает. В 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#in url()не рекомендуется. Единственная полезная группа - это (?i)URL-адреса без учета регистра, однако URL-адреса без учета регистра не являются хорошей практикой, поскольку они создают несколько записей, например, для поисковых систем. Альтернативным решением может быть создание объекта, handler404который ищет символы в верхнем регистре в URL-адресе и перенаправляет их на эквивалент в нижнем регистре.
  • rendererАргумент добавляется к Widget.render()методу. Методы, которые не принимают этот аргумент, будут работать в течение периода устаревания.

Copyright ©2021 All rights reserved