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

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

1 августа 2018 г.

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

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

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

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

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

Что нового в Джанго 2.1

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

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

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

Есть пара соображений по обратной несовместимости.

Минорные изменения

django.contrib.admin

  • ModelAdmin.search_fields теперь принимает любой поиск, например field__exact.

  • jQuery обновлен с версии 2.2.3 до 3.3.1.

  • Новый метод ModelAdmin.delete_queryset() позволяет настроить процесс удаления действия «удалить выбранные объекты».

  • Теперь вы можете переопределить сайт администратора по умолчанию.

  • Новый атрибут ModelAdmin.sortable_by и метод ModelAdmin.get_sortable_by() позволяют ограничить количество столбцов, которые можно сортировать на странице списка изменений.

  • Атрибут admin_order_field для элементов в ModelAdmin.list_display теперь может быть выражением запроса.

  • Новый метод ModelAdmin.get_deleted_objects() позволяет настроить процесс удаления представления удаления и действие «удалить выбранное».

  • Шаблоны actions.html, change_list_results.html, date_hierarchy.html, pagination.html, prepopulated_fields_js.html, search_form.html и submit_line.html теперь можно переопределить для каждого приложения или для каждой модели. <admin-templates-overridden-per-app-or-model>` (помимо переопределения глобально).

  • Инструменты объекта списка изменений администратора и формы изменения теперь можно переопределить для каждого приложения, для каждой модели или глобально с помощью шаблонов change_list_object_tools.html и change_form_object_tools.html.

  • InlineModelAdmin.has_add_permission() теперь передает родительский объект в качестве второго позиционного аргумента obj.

  • Действия администратора теперь могут указывать разрешения, чтобы ограничить их доступность для определенных пользователей.

django.contrib.auth

django.contrib.gis

  • Новый метод GEOSGeometry.buffer_with_style() представляет собой версию buffer(), которая позволяет настраивать стиль буфера.

  • OpenLayersWidget теперь основан на OpenLayers 4.6.5 (ранее 3.20.1).

django.contrib.sessions

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

Кэш

  • Серверная часть кэша локальной памяти <local-memory-caching>` теперь использует стратегию отсеивания наименее используемых данных (LRU), а не псевдослучайную.

  • Новый метод touch() API низкоуровневого кэша обновляет время ожидания ключей кэша.

CSRF

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

Формы

  • Виджет для ImageField теперь отображается с атрибутом HTMLaccept=»image/*»``.

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

  • Добавлена ​​функция get_supported_language_variant().

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

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

  • Новая опция inspectdb --include-views позволяет создавать модели для представлений базы данных.

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

Миграции

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

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

Модели

  • Модели теперь могут использовать __init_subclass__() из PEP 487.

  • Для 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().

  • В HttpResponse.set_cookie() добавлен аргумент samesite, позволяющий установить флаг cookie SameSite.

  • Новый аргумент as_attachment для :class:~django.http.FileResponse` устанавливает заголовок Content-Disposition, чтобы браузер спрашивал, хочет ли пользователь загрузить файл. FileResponse также пытается установить заголовки Content-Type и Content-Length, где это необходимо.

Шаблоны

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

Тесты

  • Добавлена ​​поддержка test Client для перенаправлений 307 и 308.

  • Тест Client теперь сериализует словарь данных запроса как JSON, если 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 и CheckboxSelectMultiple с MultiWidget, контекстная переменная wrap_label теперь отображается как атрибут каждой опции. Например, в пользовательском шаблоне input_option.html измените {% if wrap_label %} на {% if widget.wrap_label %}.

Файлы cookie SameSite

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

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

  • Минимальная поддерживаемая версия mysqlclient увеличена с 1.3.3 до 1.3.7.

  • Поддержка SQLite < 3.7.15 удалена.

  • Формат даты директивы Expires Set-Cookie изменен на RFC 7231 Section 7.1.1.1 вместо стандарта файлов cookie Netscape. Дефисы, присутствующие в датах типа «Вт, 25 декабря 2018 г., 22:26:13 GMT», удаляются. Это изменение должно быть чисто косметическим, за исключением, возможно, устаревших браузеров, которые не анализируют новый формат.

  • allowed_hosts теперь является обязательным аргументом частного API django.utils.http.is_safe_url().

  • Атрибут multiple, отображаемый виджетом SelectMultiple, теперь использует логический синтаксис HTML5, а не multiple="multiple" XHTML.

  • 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 в качестве значения поиска django.contrib.postgres.fields.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() Lookup Registration 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() для встроенных флагов в группах регулярных выражений ((?i), (?L), (?m), (?s) и (?u)) удалена.

  • Поддержка методов Widget.render() без аргумента renderer удалена.

Back to Top