Примечания к выпуску 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
¶
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
шаблоны теперь могут быть переопределены в приложении или в модели (помимо переопределены во всем мире).- В список изменений администратора и изменение форма объект инструменты теперь могут быть переопределены в приложение, в зависимости от модели, или глобально
с
change_list_object_tools.html
иchange_form_object_tools.html
шаблонами. InlineModelAdmin.has_add_permission()
В настоящее время передается родительский объект как второй аргумент,obj
.- Действия администратора теперь могут указывать разрешения, чтобы ограничить их доступность для определенных пользователей.
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
параметр для установкиSameSite
флага cookie для файлов cookie сеанса.
Кэш ¶
- Бэкэнды локальной памяти теперь использует наименее недавно использовавшихся (LRU) выбраковки стратегию , а не псевдослучайной один.
- Новый
touch()
метод API низкоуровневого кеша обновляет тайм-аут ключей кеша.
CSRF ¶
- Добавлена
CSRF_COOKIE_SAMESITE
настройка для установкиSameSite
флага cookie для файлов 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 . - Теперь для 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 ifcontent_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
with 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
«SExpires
директивы изменяется , чтобы следовать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 логический синтаксис , а не 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
аргумента удалена.