Примечания к выпуску 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

Разрешение на отображение ( view ) для моделей

Разрешение на отображение ( view ) было добавлено к разрешениям Meta.default_permissions модели. Новые разрешения будут автоматически созданы при запуске migrate .

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

Однако существует ряд соображений обратной совместимости .

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

django.contrib.admin

django.contrib.auth

django.contrib.gis

django.contrib.sessions

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

Кэш

CSRF

  • Установка CSRF_COOKIE_SAMESITE была добавлена , чтобы установить параметр куков SameSite для 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 .
  • Теперь editable=True для поля можно определить BinaryField , хотите ли вы включать его в формы шаблона.
  • Был добавлен ряд новых текстовых баз данных функций: 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 .
  • QuerySet.raw() теперь поддерживает prefetch_related() .

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

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

Шаблоны

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

Тесты

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

Изменения, несовместимые со старыми версиями Django 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 и CheckboxSelectMultiple with MultiWidget , переменная контекста wrap_label теперь отображается как атрибут всех параметров. Например, в настраиваемом трафарете input_option.html измените на .{% if wrap_label %} {% if widget.wrap_label %}

Файлы cookie SameSite

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

Соображения по поводу нового разрешения на отображение моделей ( view )

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

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

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 была удалена.
  • Формат даты директивы Expires от Set-Cookie модифицировали подчиняться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 es изменилось с 0 на пустую строку, что, по сути, может потребовать некоторой настройки тестов, сравнивающих HTML.
  • meth: .User.has_usable_password, и функция is_password_usable() больше не возвращает, False если пароль None или пустая строка, или если пароль использует алгоритм, не указанный в настройке PASSWORD_HASHERS . Это недокументированное поведение было регрессом в Django 1.6 и не позволяло пользователям с такими паролями запрашивать сброс пароля. Изучите свой код, чтобы убедиться, что вы используете этот API не в соответствии со старым поведением.
  • Поскольку миграции теперь также загружаются из файлов .pyc , может потребоваться их удаление, если вы работаете в смешанной среде Python 2 и Python 3.
  • Использование None в качестве значения поиска JSONField теперь позволяет находить объекты, для которых указанный ключ равен нулю, а не объекты, не имеющие этого ключа.
  • Класс Admin 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 .

Функции, устаревшие в Django 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.

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

Эти функции достигли конца цикла устаревания и постепенно прекращаются в Django 2.1. См. Подробности в разделе « Функции, не рекомендуемые в Django 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() флаги строк в регулярных выражениях групп ( (?i) , (?L) , (?m) , (?s) , и (?u) ) были удалены.
  • Удалена поддержка методов Widget.render() без параметра renderer .

Copyright ©2021 All rights reserved