Примечания к выпуску 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
¶
ModelAdmin.search_fields
теперь принимает выражения запроса типаchamp__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
для установки параметра cookieSameSite
для файлов cookie сеанса.
Кэш ¶
- Механизм кэширования локальной памяти теперь использует алгоритм очистки LRU (на основе даты использования), а не псевдослучайный алгоритм.
- Новый
touch()
метод API низкоуровневого кэша обновляет тайм-аут ключей кеша.
CSRF ¶
- Установка
CSRF_COOKIE_SAMESITE
была добавлена , чтобы установить параметр куковSameSite
для CSRF печенья.
Формы ¶
- Компонент
ImageField
теперь создается с атрибутом HTMLaccept="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()
разрешить установку параметра cookieSameSite
. - Новый параметр
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
теперь является обязательным параметром частного APIdjango.utils.http.is_safe_url()
.- Атрибут,
multiple
созданный компонентом,SelectMultiple
теперь использует логический синтаксис HTML5, а не форму XHTMLmultiple="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
.