Примечания к выпуску Django 2.1¶
*1 августа 2018 г.
Добро пожаловать в Django 2.1!
Эти заметки о выпуске охватывают new features, а также некоторые backwards incompatible changes, о которых вы захотите знать при переходе с Django 2.0 или более ранней версии. Мы dropped some features, которые достигли конца своего цикла устаревания, и мы begun the deprecation process for some features.
См. руководство Обновление 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() является новым. Реализация обратно совместима, так как нет необходимости назначать разрешение «просмотр», чтобы пользователи, имеющие разрешение «изменение», могли редактировать объекты.
Есть несколько backwards incompatible considerations.
Незначительные особенности¶
django.contrib.admin¶
ModelAdmin.search_fieldsтеперь принимает любой поиск, напримерfield__exact.- jQuery обновлен с версии 2.2.3 до 3.3.1.
- Новый метод
ModelAdmin.delete_queryset()позволяет настраивать процесс удаления действия «удалить выбранные объекты». - Теперь вы можете override the default admin site.
- Новый атрибут
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теперь могут быть overridden per app or per model (помимо глобального переопределения). - Инструменты списка изменений администратора и объекта формы изменений теперь могут быть overridden per app, per model, or globally с шаблонами
change_list_object_tools.htmlиchange_form_object_tools.html. InlineModelAdmin.has_add_permission()теперь передается родительский объект в качестве второго позиционного аргумента,obj.- Действия администратора теперь могут specify permissions, чтобы ограничить их доступность для определенных пользователей.
django.contrib.auth¶
createsuperuserтеперь выдает подсказку, позволяющую обойти проверкуAUTH_PASSWORD_VALIDATORS.
django.contrib.gis¶
- Новый метод
GEOSGeometry.buffer_with_style()- это версияbuffer(), позволяющая настраивать стиль буфера. OpenLayersWidgetтеперь основан на OpenLayers 4.6.5 (ранее 3.20.1).
django.contrib.sessions¶
- Добавлена настройка
SESSION_COOKIE_SAMESITEдля установки флагаSameSitecookie для сессионных cookie.
Кэш¶
- Теперь local-memory cache backend использует стратегию очистки по наименее часто используемому принципу (LRU), а не псевдослучайную.
- Новый метод
touch()low-level cache API обновляет таймаут ключей кэша.
CSRF¶
- Добавлена настройка
CSRF_COOKIE_SAMESITEдля установки флагаSameSitecookie на CSRF cookie.
Формы¶
- Виджет для
ImageFieldтеперь отображается с HTML-атрибутомaccept="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 в базе данных. QuerySet.raw()теперь поддерживаетprefetch_related().
Запросы и ответы¶
- Добавлено
HttpRequest.get_full_path_info(). - Добавлен аргумент
samesiteкHttpResponse.set_cookie()для возможности установки флага cookieSameSite. - Новый аргумент
as_attachmentдля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 с помощью параметра клиента testjson_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 %}.
SameSite cookies¶
Куки, используемые для django.contrib.sessions, django.contrib.messages и CSRF-защиты Django, теперь по умолчанию устанавливают флаг SameSite на Lax. Браузеры, уважающие этот флаг, не будут отправлять эти куки при кросс-оригинальных запросах. Если вы полагаетесь на старое поведение, установите флаг SESSION_COOKIE_SAMESITE и/или CSRF_COOKIE_SAMESITE в значение None.
Соображения для нового разрешения модели «просмотр»¶
Пользовательские формы администратора должны учитывать случай «только для просмотра¶
С новым разрешением «view» существующие пользовательские формы администратора могут выдавать ошибки, если у пользователя нет разрешения на изменение, поскольку форма может обращаться к несуществующим полям. Исправьте это, переопределив 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-CookieExpiresизменен, чтобы следовать RFC 7231#section-7.1.1.1 вместо стандарта cookie от Netscape. Дефисы, присутствующие в датах типаTue, 25-Dec-2018 22:26:13 GMT, удалены. Это изменение должно быть просто косметическим, за исключением, возможно, устаревших браузеров, которые не воспринимают новый формат. allowed_hostsтеперь является обязательным аргументом частного APIdjango.utils.http.is_safe_url().- Атрибут
multiple, отображаемый виджетомSelectMultiple, теперь использует синтаксис HTML5 boolean, а не XHTMLmultiple="multiple". - HTML, отображаемый виджетами форм, больше не включает закрывающую косую черту для элементов void, например,
<br>. Это несовместимо с XHTML, хотя некоторые виджеты уже используют такие аспекты HTML5, как атрибуты boolean. - Значение пустых опций
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 decorator.
- Команды управления больше не позволяют использовать сокращенные формы аргументов
--settingsи--pythonpath. - Частная константа
django.db.models.sql.constants.QUERY_TERMSудаляется. Методыget_lookup()иget_lookups()константы Lookup Registration API могут быть подходящими альтернативами. По сравнению с константойQUERY_TERMS, они позволяют вашему коду также учитывать любые зарегистрированные пользовательские поиски. - Совместимость с
py-bcryptудалена, так как она не поддерживается. Вместо этого используйте bcrypt.
Функции, устаревшие в версии 2.1¶
Разное¶
- Функция
ForceRHRGIS устарела в пользу новой функции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.