Примечания к выпуску 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. На этом этапе вы должны иметь возможность запускать тесты для своего проекта с помощью python -Wd, чтобы вывести предупреждения об устаревании. После их исправления ваше приложение должно быть совместимо с Django 2.0.

Что нового в Django 1.11

Индекс модели на основе классов

Новый модуль django.db.models.indexes содержит классы, упрощающие создание индексов базы данных. Эти индексы можно добавлять к моделям с помощью опции Meta.indexes .

Класс Index создает индекс b-дерева, как если бы вы указали параметр db_index в поле модели или index_together в классе Meta модели. Его можно унаследовать для поддержки различных типов индексов, например GinIndex . Он также позволяет вам определять сортировку (ASC / DESC) для столбцов индекса.

Рендеринг HTML-компонентов на основе шаблонов

Чтобы упростить настройку компонентов HTML-форм, их отрисовка теперь выполняется через систему шаблонов, а не в коде Python. См. API отрисовки форм .

Возможно, вам придется адаптировать пользовательские компоненты, которые вы написали, из-за некоторых изменений , не имеющих обратной совместимости .

Выражения 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() Теперь вращает ключ сеанса, чтобы разрешить изменение пароля для аннулирования украденных файлов cookie сеанса.
  • Новый атрибут success_url_allowed_hosts в LoginView и LogoutView используется для обозначения набора узлов , которые являются надежными для перенаправления после подключения или отключения.
  • help_text Добавлен справочный контент для валидаторов паролей для UserCreationForm .
  • Теперь запрос HttpRequest передается, authenticate() который, в свою очередь, передает его механизму аутентификации, если последний принимает параметр request .
  • Теперь сигнал user_login_failed() получает параметр request .
  • PasswordResetForm поддерживает настраиваемые пользовательские шаблоны, в которых используется поле адреса электронной почты с именем, отличным от 'email' . Установите CustomUser.EMAIL_FIELD значение соответствующего имени поля.
  • get_user_model() теперь можно вызывать во время импорта даже в модулях, определяющих модели.

django.contrib.contenttypes

  • Когда в порядке будут обнаружены устаревшие типы контента remove_stale_contenttypes , вы увидите список связанных объектов, которые также будут удалены, например auth.Permission . Раньше перечислялись только типы контента (и это приглашение появлялось после, 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 для определения настраиваемого класса, который заботится о кодировании типов данных, не поддерживаемых стандартным кодировщиком.
  • Класс mixin CIText и операция миграции CITextExtension являются новыми и позволяют использовать расширение citext PostgreSQL для запросов без учета регистра. Предусмотрено три поля: CICharField , CIEmailField и CITextField .
  • Новая функция JSONBAgg позволяет агрегировать значения в виде массива JSON.
  • Поле шаблона и поле HStoreField формы HStoreField используются для хранения нулевых значений.

Кэш

  • Механизмы Memcached теперь передают содержимое OPTIONS названных параметров производителям клиентов, что позволяет более точно контролировать поведение клиентов. Примеры см. В документации по настройкам кеша .
  • Механизмы Memcached теперь позволяют определять несколько серверов в виде строки, разделенной запятыми LOCATION , для удобства сторонних служб, которые используют такие строки в переменных среды.

CSRF

  • Установка CSRF_USE_SESSIONS была добавлена , чтобы позволить CSRF токен хранить в сессии пользователей , а не в куки.

Ядра баз данных

  • Параметр skip_locked был добавлен в QuerySet.select_for_update() PostgreSQL 9.5+ и Oracle для выполнения запросов .FOR UPDATE SKIP LOCKED
  • Установка TEST['TEMPLATE'] была добавлена , чтобы позволить пользователям PostgreSQL указать шаблон , из которого создается база данных испытаний.
  • QuerySet.iterator() теперь использует курсоры на стороне сервера с PostgreSQL. Эта функция передает часть нагрузки на память (используемую для хранения результатов запроса) в базу данных и может увеличить использование памяти базы данных.
  • Для 'isolation_level' MySQL теперь поддерживается опция, 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() .

Формы

  • Новый атрибут CharField.empty_value используется для определения значения Python для представления «пустого» значения.
  • Новый метод Form.get_initial_for_field() возвращает исходные данные поля формы.

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

  • Форматирование и настройка чисел NUMBER_GROUPING поддерживает группировку неоднородных цифр.

Команды администрирования

  • Новая опция позволяет исключить модели и приложения при загрузке данных по снимкам.loaddata --exclude
  • Новая опция позволяет вам определить модуль настройки, отличный от модуля Django по умолчанию для сравнения.diffsettings --default
  • Теперь настройки app_label ограничивают вывод файлов .showmigrations --plan

Миграции

  • uuid.UUID Добавлена поддержка сериализации объектов .

Модели

Запросы и ответы

  • QueryDict.fromkeys() был добавлен.
  • CommonMiddleware теперь определяет заголовок Content-Length для ответов, которые не относятся к типу stream.
  • SECURE_HSTS_PRELOAD Была добавлена настройка, позволяющая добавить директиву preload в заголовок Strict-Transport-Security .
  • ConditionalGetMiddleware теперь добавляет заголовок ETag к ответам.

Сериализация

  • Новый атрибут django.core.serializers.base.Serializer.stream_class позволяет подклассам настраивать поток по умолчанию.
  • Кодер используется сериализатором JSON теперь может быть настроена путем передачи имени параметра cls функции serializers.serialize() .
  • DjangoJSONEncoder теперь может сериализовать объекты timedelta (используемые DurationField ).

Шаблоны

  • mark_safe() теперь можно использовать как декоратор.
  • Механизм шаблонов Jinja2 теперь принимает обработчики контекста, задав параметр 'context_processors' в OPTIONS .
  • Тег regroup теперь возвращает namedtuple словари вместо словарей, что позволяет напрямую расширять групповой объект в цикле, например. ,{% 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() если вы хотите отключить это поведение.

Валидаторы

Изменения несовместимы со старыми версиями в Django 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 прекращена.
  • Компоненты Forms в администрировании contrib.gis.forms.widgets и OpenLayersWidget администрировании используют API-интерфейс Forms Renderer вместо 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 установил 9.3 как минимальную официально поддерживаемую версию PostgreSQL.

Поддержка 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, когда приложение работает под HTTPS.

QuerySet.get_or_create() и update_or_create() проверить их параметры

Чтобы предотвратить автоматическое игнорирование опечаток get_or_create() и update_or_create() проверить, являются ли их параметры полями шаблона. Он должен быть обратно совместимым до тех пор, пока он не обнаруживает аномалию в вашем проекте.

pytz является необходимой зависимостью и поддержки удаляются settings.TIME_ZONE = None

Чтобы упростить управление часовыми поясами в Django, pytz теперь это обязательная зависимость. Эта библиотека автоматически устанавливается при установке Django.

Поддержка удалена, так как поведение обычно не используется и сомнительно полезно. Если вы хотите автоматически определять часовой пояс на основе системного часового пояса, вы можете использовать tzlocal :settings.TIME_ZONE = None

from tzlocal import get_localzone

TIME_ZONE = get_localzone().zone

Работает как за исключением того, что еще и определяет . Сообщите нам, если вы считаете, что существует ситуация, когда невозможно адаптировать код для определения часового пояса .settings.TIME_ZONE = None os.environ['TZ'] TIME_ZONE

Изменения HTML в шаблонах администрирования

<p class="help"> заменяется тегом, <div> позволяющим включать списки в текст справки.

Поля, доступные только для чтения, заключаются в оболочку вместо того, чтобы разрешить включение любого HTML-кода в содержимое поля.<div class="readonly">...</div> <p>...</p>

Изменения в связи с введением рендеринга HTML-компонентов на основе шаблонов

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

  • Ошибки 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 продукты, создаваемые компонентами формы, теперь используют логический синтаксис HTML 5 вместо XHTML checked="checked" и синтаксиса selected='selected' .

  • RelatedManager.add() , remove() , clear() И в set() настоящее время стереть кэш prefetch_related() .

  • Чтобы избежать возможной потери сохраненных настроек, setup_test_environment() теперь выдает исключение при повторном вызове перед вызовом teardown_test_environment() .

  • Без документов псевдоним DateTimeAwareJSONEncoder из DjangoJSONEncoder (переименовано в Django 1.0) был удален.

  • Теперь включено , если не указан и является (последним вариантом по умолчанию значения ). Это может быть обратно несовместимым, если у вас есть теги шаблона, которые не являются потокобезопасными .cached template loader OPTIONS['loaders'] OPTIONS['debug'] False DEBUG

  • Приглашение удалить устаревшие типы контента больше не появляется после того, как заказ был запущен migrate . Вместо этого используйте новую команду remove_stale_contenttypes .

  • Компонент формы администрирования для IntegerField использования type="number" вместо type="text" .

  • Условные заголовки HTTP теперь анализируются и сравниваются в соответствии со спецификацией условного запроса. RFC 7232, а не старыйRFC 2616 .

  • patch_response_headers() больше не добавляет заголовок Last-Modified . В соответствии сRFC 7234 # section-4.2.2 , этот заголовок не нужен, если присутствуют другие заголовки кеша, указывающие явную дату истечения срока действия, напримерExpires илиCache-Control . UpdateCacheMiddleware иadd_never_cache_headers() вызывают,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 если вам нужно одинаковое разрешение независимо от размера файла.

Функции, устаревшие в Django 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 .
  • Скрытие исключений, возникающих при рендеринге тега шаблона, не рекомендуется, поскольку такое поведение иногда сбивало с толку. В 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 был устаревшим в пользу контроля .Model._meta.auto_field is not None
  • Использование групп регулярных выражений с iLmsu# in url() не рекомендуется. Единственная полезная группа - (?i) для URL-адресов без учета регистра; однако использование этих URL-адресов не рекомендуется, так как они создают, например, несколько записей для поисковых систем. Альтернативным решением может быть создание функции, которая handler404 ищет символы верхнего регистра в URL-адресе и перенаправляет на эквивалент в нижнем регистре.
  • Параметр renderer добавлен в метод Widget.render() . Методы, которые не принимают этот параметр, все равно будут работать в период устаревания.

Copyright ©2021 All rights reserved