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

1 августа 2018 г.

Добро пожаловать в Django 2.1!

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

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

Совместимость с Python

Django 2.1 поддерживает Python 3.5, 3.6 и 3.7. Django 2.0 - последняя версия, поддерживающая Python 3.4. Мы настоятельно рекомендуем и официально поддерживаем только последний выпуск каждой серии.

Что нового в Django 2.1

Разрешение на «просмотр» модели

К модели добавлено разрешение «просмотр» Meta.default_permissions. Новые разрешения будут созданы автоматически при запуске migrate.

Это позволяет предоставить пользователям доступ только для чтения к моделям в админке. ModelAdmin.has_view_permission()новый. Реализация обратно совместима в том смысле, что нет необходимости назначать разрешение «просмотр», чтобы пользователи, имеющие разрешение на «изменение», могли редактировать объекты.

Есть несколько факторов обратной несовместимости .

Незначительные особенности

django.contrib.admin

django.contrib.auth

django.contrib.gis

django.contrib.sessions

  • Добавлен SESSION_COOKIE_SAMESITEпараметр для установки SameSite флага cookie для файлов cookie сеанса.

Кэш

CSRF

  • Добавлена CSRF_COOKIE_SAMESITEнастройка для установки SameSite флага cookie для файлов cookie CSRF.

Формы

  • На данный момент виджет ImageFieldотображается с атрибутом HTML accept="image/*".

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

  • Добавил get_supported_language_variant() функцию.
  • Непереведенные строки для вариантов территориального языка теперь используют переводы общего языка. Например, для непереведенных pt_BR строк используются ptпереводы.

Команды управления

  • Новая опция позволяет создавать модели для представлений базы данных.inspectdb --include-views
  • BaseCommandКласс теперь использует пользовательскую помощь форматировщика так , что стандартные варианты , как --verbosityи --settings появляются последними в выходе помощи, давая более видную позицию вариантов подклассов командования.

Миграции

  • Добавлена ​​поддержка сериализации functools.partialmethodобъектов.
  • Для поддержки замороженных сред миграции могут загружаться из .pycфайлов.

Модели

  • Модели теперь можно использовать __init_subclass__()изPEP 487 .
  • Теперь для A BinaryFieldможет быть установлено значение, editable=Trueесли вы хотите включить его в формы модели.
  • Ряд новых функций текста базы данных добавляются: Chr, Left, LPad, LTrim, Ord, Repeat, Replace, Right, RPad, RTrim, и Trim.
  • Новая TruncWeekфункция усекает DateFieldи DateTimeFieldдо понедельника недели.
  • Выражения запроса теперь можно отрицать с помощью знака минус.
  • QuerySet.order_by()и distinct(*fields) теперь поддерживают использование преобразований полей.
  • BooleanFieldтеперь может быть null=True. Это рекомендуется вместо того NullBooleanField, что, вероятно, в будущем будет прекращено.
  • Новый QuerySet.explain()метод отображает план выполнения базы данных запроса набора запросов.
  • QuerySet.raw()теперь поддерживает prefetch_related().

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

  • Добавлен HttpRequest.get_full_path_info().
  • Добавлен samesiteаргумент, HttpResponse.set_cookie()позволяющий установить SameSiteфлаг cookie.
  • Новый as_attachmentаргумент для FileResponse устанавливает Content-Dispositionзаголовок, чтобы браузер спрашивал, хочет ли пользователь загрузить файл. FileResponseтакже пытается установить Content-Typeи Content-Lengthзаголовки , где это необходимо.

Шаблоны

  • Новый json_scriptфильтр безопасно выводит объект Python в формате JSON, заключенный в <script>тег, готовый для использования с JavaScript.

Тесты

  • Добавлена ​​тестовая Clientподдержка 307 и 308 редиректов.
  • Теперь тест Clientсериализует словарь данных запроса как JSON if content_type='application/json'. Вы можете настроить кодировщик JSON с помощью json_encoderпараметра тестового клиента .
  • Новый SimpleTestCase.assertWarnsMessage()метод представляет собой более простую версию assertWarnsRegex().

Задом несовместимые изменения в 2.1

API серверной части базы данных

В этом разделе описаны изменения, которые могут потребоваться в сторонних серверах баз данных.

  • Придерживаться PEP 249 , исключения, когда база данных не поддерживает функцию, изменены сNotImplementedErrorна django.db.NotSupportedError.
  • allow_sliced_subqueriesФлаг функции базы данных переименован в allow_sliced_subqueries_with_in.
  • DatabaseOperations.distinct_sql()теперь требует дополнительного params аргумента и возвращает кортеж SQL и параметров вместо строки SQL.
  • DatabaseFeatures.introspected_boolean_field_type меняется с метода на свойство.

django.contrib.gis

  • Поддержка SpatiaLite 4.0 удалена.

Прекращена поддержка MySQL 5.5

Окончание восходящей поддержки MySQL 5.5 - декабрь 2018 г. Django 2.1 поддерживает MySQL 5.6 и выше.

Прекращена поддержка PostgreSQL 9.3

Окончание восходящей поддержки PostgreSQL 9.3 - сентябрь 2018 года. Django 2.1 поддерживает PostgreSQL 9.4 и выше.

Удалено BCryptPasswordHasherиз PASSWORD_HASHERSнастройки по умолчанию

Если вы использовали bcrypt с Django 1.4 или 1.5 (до того, как он BCryptSHA256PasswordHasher был добавлен в Django 1.6), у вас могут быть пароли, использующие BCryptPasswordHasherхешер.

Вы можете проверить это так:

from django.contrib.auth import get_user_model
User = get_user_model()
User.objects.filter(password__startswith='bcrypt$$')

Если вы хотите и дальше разрешать использование этих паролей, вам нужно будет определить PASSWORD_HASHERSнастройку (если вы еще этого не сделали) и включить 'django.contrib.auth.hashers.BCryptPasswordHasher'.

Перемещена wrap_labelпеременная контекста шаблона виджета

Чтобы исправить отсутствие <label>при использовании RadioSelectи CheckboxSelectMultiplewith MultiWidget, wrap_labelпеременная контекста теперь отображается как атрибут каждой опции. Например, в настраиваемом input_option.htmlшаблоне измените на .{% if wrap_label %}{% if widget.wrap_label %}

SameSiteкуки

Куки используются для django.contrib.sessions, django.contrib.messagesи защита от CSRF Django теперь установить SameSiteфлаг Laxпо умолчанию. Браузеры, которые соблюдают этот флаг, не будут отправлять эти файлы cookie на запросы из разных источников. Если вы полагаетесь на старое поведение, установите для параметра SESSION_COOKIE_SAMESITEи / или CSRF_COOKIE_SAMESITE значение None.

Соображения по поводу разрешения на «просмотр» новой модели

Пользовательские формы администратора должны учитывать случай только для просмотра

С новым разрешением «просмотр» существующие настраиваемые формы администратора могут вызывать ошибки, если у пользователя нет разрешения на изменение, поскольку форма может получить доступ к несуществующим полям. Исправьте это, переопределив ModelAdmin.get_form()и проверив, есть ли у пользователя права на «изменение», и вернув форму по умолчанию, если нет:

class MyAdmin(admin.ModelAdmin):
    def get_form(self, request, obj=None, **kwargs):
        if not self.has_change_permission(request, obj):
            return super().get_form(request, obj, **kwargs)
        return CustomForm

Новое разрешение просмотра по умолчанию может позволить нежелательный доступ к представлениям администратора

Если у вас есть настраиваемое разрешение с кодовым именем формы view_<modelname>, новая обработка разрешений на просмотр в админке позволит просматривать доступ к списку изменений и страницам сведений для этих моделей. Если это нежелательно, вы должны изменить свое собственное кодовое имя разрешения.

Разное

  • Минимальная поддерживаемая версия mysqlclientувеличена с 1.3.3 до 1.3.7.
  • Поддержка SQLite <3.7.15 удалена.
  • Формат даты Set-Cookie«S Expiresдирективы изменяется , чтобы следоватьRFC 7231 # section-7.1.1.1 вместо стандарта cookie Netscape. Дефисы, присутствующие в таких датах, какудаляются. Это изменение должно быть чисто косметическим, за исключением, возможно, устаревших браузеров, которые не анализируют новый формат.Tue, 25-Dec-2018 22:26:13 GMT
  • allowed_hostsтеперь является обязательным аргументом частного API django.utils.http.is_safe_url().
  • multipleАтрибут оказываемая SelectMultipleвиджета теперь использует HTML5 логический синтаксис , а не XHTML - х multiple="multiple".
  • HTML, отображаемый виджетами формы, больше не включает закрывающую косую черту на пустых элементах, например <br>. Это несовместимо с XHTML, хотя некоторые виджеты уже использовали аспекты HTML5, такие как логические атрибуты.
  • Значение SelectDateWidgetпустых параметров изменяется с 0 на пустую строку, что в основном может потребовать некоторых корректировок в тестах, сравнивающих HTML.
  • User.has_usable_password()и is_password_usable()функция больше не возвращает, Falseесли пароль Noneили пустая строка, или если пароль использует хешер, которого нет в PASSWORD_HASHERSнастройке. Это недокументированное поведение было регрессом в Django 1.6 и не позволяло пользователям с такими паролями запрашивать сброс пароля. Проверьте свой код, чтобы убедиться, что использование этих API-интерфейсов не зависит от старого поведения.
  • Поскольку миграции теперь загружаются из .pycфайлов, вам может потребоваться удалить их, если вы работаете в смешанной среде Python 2 и Python 3.
  • Использование Noneв качестве JSONFieldзначения поиска теперь соответствует объектам с указанным ключом и нулевым значением, а не объектам, у которых нет ключа.
  • CSS-класс администратора field-boxпереименован в, fieldBoxчтобы предотвратить конфликты с классом, присвоенным полям модели с именем «box».
  • Так как админ actions.html, change_list_results.html, date_hierarchy.html, pagination.html, prepopulated_fields_js.html, search_form.html, и submit_line.htmlшаблоны теперь могут быть переопределены в приложение или в зависимости от модели, возможно , потребуется переименовать существующие шаблоны с теми именами , которые были написаны для разных целей.
  • QuerySet.raw()теперь кэширует свои результаты как обычные наборы запросов. Используйте, iterator()если вам не нужно кеширование.
  • Метод маршрутизатора базы данных allow_relation()вызывается в большем количестве случаев. Неправильно написанные маршрутизаторы могут нуждаться в соответствующем обновлении.
  • Переводы больше не деактивируются перед запуском команд управления. Если ваша пользовательская команда требует, чтобы переводы были деактивированы (например, чтобы вставить непереведенный контент в базу данных), используйте новый декоратор @no_translations .
  • Команды управления больше не позволяют сокращенные формы из --settingsи --pythonpathаргументов.
  • Частная django.db.models.sql.constants.QUERY_TERMSконстанта удалена. В get_lookup() и get_lookups()методе регистрации API Поиска может быть подходящими альтернативами. По сравнению с QUERY_TERMSконстантой они позволяют вашему коду также учитывать любые зарегистрированные пользовательские поисковые запросы.
  • Совместимость с py-bcryptудалена, поскольку она не поддерживается. Вместо этого используйте bcrypt .

Функции, устаревшие в 2.1

Разное

  • Функция ForceRHRГИС устарела в пользу новой ForcePolygonCWфункции.
  • django.utils.http.cookie_date()устарел в пользу http_date(), который соответствует формату последнего RFC.
  • {% load staticfiles %}и устарели в пользу , что работает так же.{% load admin_static %}{% load static %}
  • django.contrib.staticfiles.templatetags.static()устарел в пользу django.templatetags.static.static().
  • Поддержка InlineModelAdmin.has_add_permission()методов, которые не принимают objв качестве второго позиционного аргумента, будет удалена в Django 3.0.

Функции, удаленные в 2.1

Эти функции достигли конца цикла устаревания и удалены в Django 2.1. Подробные сведения см. В разделе « Функции, не рекомендуемые в версии 1.11» , в том числе о том, как отказаться от использования этих функций.

  • contrib.auth.views.login(), logout(), password_change(), password_change_done(), password_reset(), password_reset_done(), password_reset_confirm(), И password_reset_complete()удаляются.
  • extra_contextПараметр contrib.auth.views.logout_then_login() удаляется.
  • django.test.runner.setup_databases() устранен.
  • django.utils.translation.string_concat() устранен.
  • django.core.cache.backends.memcached.PyLibMCCacheбольше не поддерживает передачу pylibmcнастроек поведения как атрибутов верхнего уровня OPTIONS.
  • hostПараметр django.utils.http.is_safe_url()удаляется.
  • Отключение звука исключений, возникающих при рендеринге тега шаблона, удалено.{% include %}
  • DatabaseIntrospection.get_indexes() устранен.
  • authenticate()Метод бэкэндов аутентификации требует в request качестве первого позиционного аргумента.
  • django.db.models.permalink()Декоратора удаляется.
  • USE_ETAGSУстановка удаляется. CommonMiddlewareи django.utils.cache.patch_response_headers()больше не устанавливают ETags.
  • Model._meta.has_auto_fieldАтрибут удаляется.
  • url()поддержка «S для встроенных флагов регулярных выражений групп ( (?i), (?L), (?m), (?s), и (?u)) удаляется.
  • Поддержка Widget.render()методов без rendererаргумента удалена.

Copyright ©2021 All rights reserved