Примечания к выпуску Django 1.9 ¶
1 декабря 2015 г.
Добро пожаловать в Django 1.9!
Эти примечания к выпуску охватывают новые функции , а также некоторые обратно несовместимые изменения, о которых вам нужно знать при обновлении с Django 1.8 или более старых версий. Мы исключили некоторые функции , срок действия которых подошел к концу, и начали процесс прекращения поддержки некоторых функций .
См. « Обновление Django до новой версии», если вы обновляете существующий проект.
Совместимость с Python ¶
Django 1.9 требует Python 2.7, 3.4 или 3.5. Мы настоятельно рекомендуем и официально поддерживаем только последнюю версию каждой серии.
Последняя серия Django 1.8 поддерживает Python 3.2 и 3.3.
Что нового в Django 1.9 ¶
Запуск действий после фиксации транзакции ¶
Новая точка входа on_commit()
позволяет выполнять действия после успешного подтверждения транзакции базы данных. Это полезно для таких задач, как отправка уведомлений по электронной почте, создание задач в очереди или аннулирование кешей.
Эта функция из пакета django-transaction-hooks была интегрирована в Django.
Проверка паролей ¶
Django теперь предлагает проверку пароля, чтобы предотвратить использование слабых паролей пользователями. Проверка встроена в формы изменения и сброса пароля и легко интегрируется в любой другой код. Проверка выполняется одним или несколькими валидаторами, настроенными в новой настройке AUTH_PASSWORD_VALIDATORS
.
В Django включены четыре валидатора; они могут обеспечить минимальную длину, сравнить пароль с атрибутами пользователя, такими как их имя, гарантировать, что пароли не полностью числовые, или сравнить со списком общих паролей , Вы можете комбинировать несколько валидаторов, и некоторые валидаторы имеют свои собственные параметры конфигурации. Например, вы можете предоставить персонализированный список общих паролей. Каждый валидатор предоставляет текст справки, чтобы объяснить свои требования пользователю.
По умолчанию проверка не выполняется и принимаются все пароли. Если вы не добавите контент AUTH_PASSWORD_VALIDATORS
, вы не увидите никаких изменений. В новых проектах, созданных с использованием шаблона по startproject
умолчанию, включен простой набор валидаторов. Чтобы включить базовую проверку в формах аутентификации Django в вашем проекте, вы можете определить, например:
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
Подробнее см. Проверка паролей .
Классы разрешений Mixins в представлениях на основе классов ¶
Django теперь поставляется с классами подмешать AccessMixin
, LoginRequiredMixin
, PermissionRequiredMixin
и UserPassesTestMixin
для обеспечения функциональных возможностей django.contrib.auth.decorators
для представлений , основанных на классах. Эти классы взяты из проекта django-braces или вдохновлены им .
Однако между реализациями Django и django-braces
” есть несколько различий :
- Атрибут
raise_exception
может быть толькоTrue
илиFalse
. Исключения или настраиваемые исполняемые объекты не поддерживаются. - Метод
handle_no_permission()
не принимает никаких параметровrequest
. Текущий запрос доступен в форматеself.request
. - Пользовательская функция
test_func()
изUserPassesTestMixin
не принимает какого - либо параметраuser
. Текущий запрос доступен в форматеself.request.user
. - Атрибут
permission_required
принимает строку (определяющую одно разрешение) или список строк (определяя несколько разрешений), которые должны быть предоставлены для разрешения доступа. - Новый атрибут
permission_denied_message
позволяет передать сообщение об исключенииPermissionDenied
.
Новый стиль для contrib.admin
¶
Интерфейс администратора имеет новый, современный, солидный вид с новыми значками SVG, которые отлично смотрятся на экранах с высокой плотностью пикселей. Это всегда гарантирует полнофункциональную работу с браузерами YUI A-level . Старые браузеры иногда могут работать в приемлемом ухудшенном режиме.
Параллельное выполнение тестов ¶
Теперь test
команда поддерживает --parallel
возможность параллельного запуска тестов проекта в нескольких процессах.
Каждый процесс работает со своей собственной базой данных. Вам необходимо убедиться, что разные тестовые примеры не обращаются к одним и тем же ресурсам. Например, тестовые примеры, влияющие на файловую систему, должны создавать временный каталог для собственного использования.
Эта опция включена по умолчанию для собственного набора тестов Django, если:
- операционная система поддерживает его (все кроме Windows)
- ядро базы данных поддерживает его (все встроенные движки, кроме Oracle)
Незначительные особенности ¶
django.contrib.admin
¶
- Административные представления теперь имеют атрибуты
model_admin
илиadmin_site
. - URL-адрес для просмотра редактирования сайта администрирования был изменен (по
/admin/<app>/<modèle>/<pk>/
умолчанию на/admin/<app>/<modèle>/<pk>/change/
). Это не должно повлиять на ваше приложение, если у вас нет жестко заданных URL-адресов администратора. В этом случае рекомендуется заменить эти ссылки на обратное разрешение URL-адресов администратора . Обратите внимание, что старый URL-адрес по-прежнему перенаправляется на новый из-за обратной совместимости, но это может прекратиться в будущей версии. ModelAdmin.get_list_select_related()
был добавлен, чтобы разрешить изменение значений,select_related()
используемых в запросе списка для модификации сайта администрирования согласно запросу.- В
available_apps
метод добавлена контекстная переменная , которая содержит список приложений, доступных текущему пользователюAdminSite.each_context()
. AdminSite.empty_value_display
иModelAdmin.empty_value_display
были добавлены для отмены отображения пустых значений в списке для модификации сайта администрирования. Также можно настроить значение для каждого поля.- События JQuery были добавлены при добавлении или удалении подчиненной формы на странице, содержащей форму редактирования.
- Компонент выбора времени включает опцию «18:00» для согласования с наличием предопределенных опций каждые 6 часов.
- Генерация ярлыков в JavaScript теперь поддерживает румынские символы.
django.contrib.admindocs
¶
- В разделе моделей
admindocs
теперь также описаны методы, которые принимают параметры, а не игнорируют их.
django.contrib.auth
¶
- По умолчанию количество итераций хеширования пароля PBKDF2 увеличено на 20%. Это изменение с обратной совместимостью не влияет на тех, кто создал подкласс
django.contrib.auth.hashers.PBKDF2PasswordHasher
для изменения значения по умолчанию. - Теперь класс
BCryptSHA256PasswordHasher
обновляет пароли при изменении его атрибутаrounds
. AbstractBaseUser
иBaseUserManager
были перенесены в новый модуль ,django.contrib.auth.base_user
так что они могут быть импортированы без необходимости включенияdjango.contrib.auth
вINSTALLED_APPS
(который сгенерировал предупреждение устаревания в старых версиях и больше не поддерживается , так как Django 1.9).- Параметр
permission
изpermission_required()
принимает все варианты итерации элементов, а не только списков и кортежей. - Новый класс
PersistentRemoteUserMiddleware
позволяет использоватьREMOTE_USER
в конфигурациях, где этот заголовок вводится только на страницах подключения, а не в других запросах сеанса. - Представление
django.contrib.auth.views.password_reset()
принимаетextra_email_context
параметр.
django.contrib.contenttypes
¶
- Теперь можно использовать
order_with_respect_to
с отношениемGenericForeignKey
.
django.contrib.gis
¶
- Все методы
GeoQuerySet
устарели и заменены эквивалентными функциями базы данных . Как только старые методы будут заменены в вашем коде, появится возможность удалить специальный менеджерGeoManager
классов вашей географической модели. - Интерфейс GDAL теперь поддерживает создание экземпляров файловых объектов и объектов GDALRaster в памяти из необработанных данных. Теперь можно изменять свойства матрицы, такие как проекция или значения пикселей.
- Для пользователей PostGIS новое поле
RasterField
позволяет хранить объекты GDALRaster . Он поддерживает автоматическое создание пространственного индекса и перепроецирование при сохранении модели. Он еще не поддерживает пространственный запрос. - Новый метод
GDALRaster.warp()
позволяет искажать структуру матрицы, задавая целевые свойства, такие как начало координат, ширина, высота или размер пикселя (среди прочего). - Новый метод
GDALRaster.transform()
позволяет преобразовать матричную структуру в другую систему пространственной привязки, указавsrid
целевой код . - Новый класс
GeoIP2
позволяет использовать базы данных MaxMind GeoLite2, которые включают поддержку адресов IPv6. - Версия библиотеки OpenLayers по умолчанию, включенная в виджеты, была обновлена с 2.13 до 2.13.1.
django.contrib.postgres
¶
rangefield.contained_by
Добавлена поддержка запросов для некоторых встроенных полей, соответствующих полям диапазона.- Поле
JSONField
добавлено. - Добавлены специальные функции агрегирования в PostgreSQL .
TransactionNow
Добавлена функция базы данных .
django.contrib.sessions
¶
- Модель сессии и классы
SessionStore
для двигателейdb
иcached_db
были переработаны , чтобы пользовательские базы данных управляемой сессии двигатель будет построен на них. Дополнительные сведения см. В разделе « Расширение механизмов сеансов, управляемых базой данных».
django.contrib.sites
¶
get_current_site()
теперь обрабатывает , например, случайrequest.get_host()
возврата . Если поиск завершился неудачно, потому что хост не соответствует записи в базе данных и у хоста есть порт, поиск перезапускается без порта и только с доменной частью.domaine:port
exemple.com:80
django.contrib.syndication
¶
- Теперь возможно несколько приложений для каждого элемента потока. Если для RSS-канала определено несколько вложений, создается исключение, поскольку RSS-каналы, в отличие от каналов Atom, не поддерживают несколько вложений для каждого элемента канала.
Кэш ¶
django.core.cache.backends.base.BaseCache
теперь есть методget_or_set()
.django.views.decorators.cache.never_cache()
теперь отправляет более убедительные заголовки ( были добавлены ), чтобы лучше предотвратить кеширование. Это также было добавлено в Django 1.8.8.no-cache, no-store, must-revalidate
Cache-Control
CSRF ¶
- Имя заголовка запроса, используемое для проверки подлинности CSRF, можно настроить с помощью
CSRF_HEADER_NAME
. - Заголовок реферера CSRF теперь проверяется на основе настройки,
CSRF_COOKIE_DOMAIN
если он установлен. Для получения более подробной информации см. « Операция» . - Новый параметр
CSRF_TRUSTED_ORIGINS
предоставляет возможность разрешать небезопасные (напримерPOST
) запросы из разных источников по HTTPS.
Ядра баз данных ¶
- Движок PostgreSQL (
django.db.backends.postgresql_psycopg2
) также доступен какdjango.db.backends.postgresql
. Старое имя будет по-прежнему доступно для обратной совместимости.
Файловое хранилище ¶
Storage.get_valid_name()
теперь вызывается, когдаupload_to
является исполняемым объектом.File
теперь есть методseekable()
с Python 3.
Формы ¶
ModelForm
принимает новую опциюMeta
field_classes
для настройки типов полей. См. Дополнительные сведения в разделе « Перегрузка полей по умолчанию» .- Теперь вы можете установить порядок отображения полей формы с помощью атрибута
field_order
, параметра конструктораfield_order
или методаorder_fields()
. - Префикс формы можно определить в классе формы, а не только при создании экземпляра формы. Подробнее см. Префиксы форм .
- Теперь вы можете определить именованные параметры , которые хотите передать конструктору формы в наборе форм.
SlugField
теперь принимает параметр,allow_unicode
разрешающий использование символов Unicode в «кратких заголовках».CharField
теперь принимает параметрstrip
для очистки введенных данных от любых начальных или конечных пробелов.True
Поэтому по умолчанию поведение отличается от предыдущих версий.- Поля формы теперь принимают параметр,
disabled
который заставляет отключенный компонент поля отображаться в браузерах. - Теперь можно настроить поля формы, связанные с данными, путем перегрузки метода
get_bound_field()
.
Общие представления ¶
- Созданные к
as_view()
настоящему времени представления на основе классов имеют атрибутыview_class
иview_initkwargs
. method_decorator()
теперь можно использовать со списком или кортежем декораторов. Вы также можете использовать его для украшения классов вместо методов .
Интернационализация ¶
- Теперь представление
django.views.i18n.set_language()
правильно перенаправляет на переведенные URL-адреса, если они доступны. - Представление
django.views.i18n.javascript_catalog()
теперь работает правильно, если используется несколько раз с разными конфигурациями на одной странице. - Функция
django.utils.timezone.make_aware()
имеет новый параметр,is_dst
помогающий разрешить неоднозначное время при переходе на летнее / зимнее время. - Теперь можно использовать языковые варианты, поддерживаемые gettext. Как правило, они используются для языков, написанных с использованием разных шрифтов, например, латиницы и кириллицы (например,
[email protected]
). - Добавлен
django.views.i18n.json_catalog()
вид, помогающий создать настраиваемую клиентскую библиотеку i18n на основе переводов Django. Он возвращает объект JSON, содержащий каталог переводов, настройки форматирования и правило множественного числа. - Атрибут
name_translated
был добавлен к объекту, возвращенному тегом шаблонаget_language_info
. Также был добавлен аналогичный шаблонный фильтрlanguage_name_translated
. - Теперь вы можете запустить
compilemessages
проект из корневого каталога, и он найдет все файлы сообщений, созданные с помощьюmakemessages
. makemessages
теперь вызывает xgettext один раз для каждого языкового каталога, а не один раз для каждого переводимого файла. Это ускоряет создание каталогов переводов.blocktrans
позволяет вам приписать свой результат переменной с помощьюasvar
.- Доступны два новых языка: колумбийский испанский и шотландский гэльский.
Команды администрирования ¶
- Новая команда
sendtestemail
позволяет отправить тестовое электронное письмо, чтобы легко убедиться, что отправка писем через Django работает. - Чтобы улучшить читаемость кода SQL, сгенерированного командой
sqlmigrate
, коду SQL, сгенерированному для каждой операции миграции, предшествует описание операции. - Результат команды
dumpdata
теперь упорядочен детерминированно. Кроме того, если--output
задана опция , команда также отображает индикатор выполнения в терминале. - Теперь команда
createcachetable
предлагает возможность--dry-run
отображать код SQL вместо его выполнения. - Команда
startapp
создает файлapps.py
. Поскольку он не содержитdefault_app_config
( нежелательный API ), вам необходимо указать путь к конфигурации приложенияINSTALLED_APPS
, например'polls.apps.PollsConfig'
, для конфигурации, которая будет использоваться (вместо простой'polls'
). - С движком PostgreSQL команда
dbshell
может подключаться к базе данных, используя пароль из файла настроек (вместо того, чтобы вводить его вручную). - Пакет
django
может быть выполнен как сценарий, например , который будет вести себя так же, как .python -m django
django-admin
- Административные команды с этой опцией
--noinput
теперь также принимают--no-input
эту опцию как псевдоним.
Миграции ¶
Начальные миграции теперь отмечены атрибутом класса, который позволяет более легко обнаруживать начальные миграции.
initial = True
migrate --fake-initial
Поддержка сериализации экземпляров
functools.partial
иLazyObject
была добавлена.При указании значения
None
для элемента вMIGRATION_MODULES
Django предполагает, что это приложение не имеет миграции.При применении миграций шаг «визуализировать состояния модели», который появляется при выполнении миграций с подробностью 2 или выше, теперь вычисляет только состояния миграций, которые уже были применены. Модельные отчеты о внутрипроцессных миграциях создаются по запросу, что резко снижает объем необходимой памяти.
Однако это улучшение недоступно при обращении миграций, и в этом случае по-прежнему необходимо предварительно вычислить и сохранить состояния промежуточных миграций.
Это улучшение также является причиной того, что Django не поддерживает смешанные планы миграции. Эти смешанные планы состоят из списка миграций, некоторые из которых должны быть реализованы, а другие - отменены. Это никогда официально не поддерживалось, и не было общедоступного API, основанного на таком поведении.
Теперь команда
squashmigrations
принимает возможность указать начальную миграцию, из которой будут объединены миграции.
Модели ¶
QuerySet.bulk_create()
теперь также работает для моделей прокси.- Конфигурация базы данных содержит новую опцию
TIME_ZONE
для взаимодействия с базами данных , которые хранят даты / время в местное время и которые не поддерживает часовые пояса , когда этоUSE_TZ
стоитTrue
. - Метод
RelatedManager.set()
был добавлен к менеджерам отношений, созданным полямиForeignKey
,GenericForeignKey
иManyToManyField
. - Метод
add()
на противоположной стороне внешнего ключа теперь имеет параметр,bulk
разрешающий выполнение одного запроса независимо от количества добавляемых объектов, вместо того, чтобы требовать одного запроса для каждого объекта. - Параметр
keep_parents
был добавлен, чтобыModel.delete()
разрешить удаление только «дочерних» данных из модели, наследуемой от других таблиц. Model.delete()
иQuerySet.delete()
вернуть количество удаленных объектов.- Была добавлена проверка системы, чтобы предотвратить установку как для одной
Meta.ordering
иorder_with_respect_to
той же модели. - Допросы могут следовать другие вопросы (например , , и т.д.). Например, .
date et d'heure
exact
gt
lt
Entry.objects.filter(pub_date__month__gt=6)
- Опросы времени (часы, минуты, секунды) теперь поддерживаются
TimeField
для всех движков баз данных. За исключением SQLite, эти запросы уже были доступны, начиная с Django 1.7, но не документированы. - Параметр
output_field
был добавлен, чтобы разрешить агрегациюAvg
по нечисловым столбцам, напримерDurationField
. - Запрос
date
был добавлен в ,DateTimeField
чтобы запрашивать поле только даты части. - Добавлены функции базы данных
Greatest
иLeast
. - Добавлена функция базы данных
Now
; это возвращает текущую дату и время. Transform
теперь является подклассом Func () , который позволяет использовать объектыTransform
в правой части выражения, какFunc
обычные объекты . Это позволяет определенные функции базы данных для регистрации в качествеLength
,Lower
аUpper
также преобразования.SlugField
теперь принимает параметр,allow_unicode
разрешающий использование символов Unicode в «кратких заголовках».- Теперь можно ссылаться на аннотации в
QuerySet.distinct()
. - С помощью SQLite
connection.queries
отображайте запросы с подставленными параметрами. - В выражении запроса теперь может быть использовано при создании новых моделей с кузовами
save()
,create()
иbulk_create()
.
Запросы и ответы ¶
- Пока это
HttpResponse.reason_phrase
не установлено явно, его значение теперь определяется текущим значениемHttpResponse.status_code
. При измененииstatus_code
за пределами конструктора также изменяется значениеreason_phrase
. - В представлении отладки теперь отображаются сведения о строке исключения в Python 3.
- Представления ошибок 40x по умолчанию теперь принимают второй позиционный параметр, исключение, вызвавшее ошибку.
- Обработчики теперь поддерживают представления ошибок
TemplateResponse
, которые обычно используются с представлениями на основе классов. - Исключения, генерируемые методом
render()
, теперь также передаются методуprocess_exception()
каждого промежуточного программного обеспечения. - По промежуточного слоя запросов теперь можно установить
HttpRequest.urlconf
дляNone
отмены любых изменений, внесенных предыдущим промежуточным ПО, и возврата кROOT_URLCONF
исходному состоянию. - Управления
DISALLOWED_USER_AGENTS
вCommonMiddleware
настоящее бросает исключениеPermissionDenied
вместо того ,HttpResponseForbidden
так что видhandler403
называется. HttpRequest.get_port()
был добавлен для получения исходного порта запроса.- Параметр
json_dumps_params
был добавлен, чтобыJsonResponse
разрешить передачу именованных параметров вызову,json.dumps()
используемому для создания ответа. - Промежуточное ПО
BrokenLinkEmailsMiddleware
теперь игнорирует ошибки 404, если реферер равен запрошенному URL. Чтобы обойти уже реализованную проверку пустого реферера, некоторые веб-роботы устанавливают для реферера то же значение, что и запрошенный URL.
Шаблоны ¶
- Теги шаблона, созданные с помощью этой утилиты,
simple_tag()
теперь могут сохранять свой результат в переменной шаблона с помощью параметраas
. - Метод
Context.setdefault()
был добавлен. - Django.template регистратор был добавлен и получает следующие сообщения:
- Сообщение уровня
DEBUG
для отсутствующих переменных контекста. - Сообщение уровня
WARNING
для неперехваченных исключений, генерируемых при рендеринге тега, когда режим отладки отключен (полезно, поскольку заглушает исключение и возвращает пустую строку).{% include %}
{% include %}
- Сообщение уровня
- Тег шаблона
firstof
позволяет сохранять результат в переменной с расширениемas
. Context.update()
теперь можно использовать как диспетчер контекста.- Загрузчики шаблонов Django теперь могут рекурсивно расширять шаблоны.
- Шаблон «postmortem» на странице отладки теперь включает результат для каждого установленного механизма шаблонов.
- Добавлена « интеграция страницы отладки для пользовательских шаблонизаторов.
- Теперь можно явно регистрировать библиотеки и встроенные элементы для движка с
DjangoTemplates
помощью настройки шаблонаOPTIONS
. - Фильтры
timesince
иtimeuntil
были улучшены для учета високосных лет для больших интервалов времени. - Тег
include
теперь кэширует объекты шаблона, отсканированные в процессе визуализации шаблона, ускоряя повторное использование в таких местах, как циклыfor
.
Тесты ¶
- Этот метод
json()
был добавлен для тестирования ответов клиентов, чтобы обеспечить доступ к телу ответа в формате JSON. - Метод
force_login()
добавлен в тестовый клиент. Используйте этот метод, чтобы имитировать эффект входа пользователя на сайт, избегая прохождения этапов аутентификации и проверкиlogin()
.
URL ¶
- Утверждения поиска теперь разрешены в регулярных выражениях шаблонов URL.
- Теперь пространство имен приложения можно задать с помощью
app_name
атрибута во включенном модуле или объекте. Его также можно установить, передав кортеж из 2 (<список шаблонов>, <пространство имен приложения>) в качестве первого аргумента вinclude()
. - Добавлены системные проверки на предмет распространенных ошибок в шаблонах URL.
Валидаторы ¶
django.core.validators.int_list_validator()
был добавлен для генерации строковых валидаторов, содержащих целые числа, разделенные настраиваемым символом.EmailValidator
отныне ограничивает длину частей доменных имен до 63 символов, в соответствии с RFC 1034 .validate_unicode_slug()
был добавлен для проверки «ярлыков», которые могут содержать символы Unicode.
Изменения, несовместимые со старыми версиями в Django 1.9 ¶
Предупреждение
В дополнение к изменениям, подробно описанным в этом разделе, обязательно ознакомьтесь с функциями, удаленными в версии 1.9, с указанием функций, которые завершили цикл устаревания и поэтому были удалены. Если вы не обновили свой код в течение времени, разрешенного периодом устаревания определенной функции, ее удаление может выглядеть как изменение, несовместимое со старыми версиями.
API ядра СУБД ¶
Некоторые новые тесты полагаются на способность движка проверять значения столбцов по умолчанию (возвращая результат в
Field.default
). Вы можете установить функциональность базы данныхcan_introspect_default
дляFalse
если ваш двигатель не позволяет этот самоанализ. Вы можете ознакомиться с реализацией движков, включенных в Django, для справки ( # 24245 ).Не рекомендуется регистрировать глобальный адаптер или преобразователь на уровне модуля DB-API для обработки информации о часовом поясе значений,
datetime
передаваемых в качестве параметров запроса или возвращаемых в качестве результатов запроса с базами данных, которые не поддерживают часовые пояса. Это может вызвать конфликты с другими библиотеками.Рекомендуемый способ добавить часовой пояс к значениям,
datetime
полученным из базы данных, - это зарегистрировать преобразователь для полейDateTimeField
вDatabaseOperations.get_db_converters()
.Функциональность базы данных
needs_datetime_string_cast
была удалена. Механизмы базы данных, которые его определяют, должны вместо этого зарегистрировать преобразователь, как описано выше.Методы
DatabaseOperations.value_to_db_<type>()
были переименованыadapt_<type>field_value()
для единообразия с методамиconvert_<type>field_value()
.Чтобы использовать новый запрос
date
, сторонним механизмам баз данных может потребоваться реализовать этот методDatabaseOperations.datetime_cast_date_sql()
.Метод
DatabaseOperations.time_extract_sql()
был добавлен. Он вызывает существующий методdate_extract_sql()
. Этот метод перегружен механизмом SQLite для добавления ежечасных запросов (час, минута, секунда) в поляTimeField
. Некоторым сторонним механизмам баз данных может потребоваться сделать то же самое.Метод
DatabaseOperations.datetime_cast_sql()
(не путать сDatabaseOperations.datetime_cast_date_sql()
упомянутым выше) был удален. Этот метод использовался для форматирования дат в Oracle задолго до версии 1.0, но не был перегружен другими встроенными механизмами в течение многих лет и не вызывался из других мест в мире. код или тесты Django.Для поддержки распараллеливания тестов метод должен быть реализован
DatabaseCreation._clone_test_db()
и определен . Может потребоваться корректировка .DatabaseFeatures.can_clone_databases = True
DatabaseCreation.get_test_db_clone_settings()
Настройки по умолчанию, которые были кортежами, теперь представлены списками ¶
По умолчанию django.conf.global_settings
включены как списки, так и кортежи. Все настройки, которые раньше были кортежами, теперь являются списками.
Атрибут is_usable
загрузчиков шаблонов был удален ¶
Загрузчики шаблонов Django ранее требовали наличия атрибута is_usable
. Если загрузчик был настроен в настройках шаблона и этот атрибут был действительным False
, загрузчик игнорировался. На практике это использовалось только загрузчиком «яйца», чтобы определить, были ли установлены инструменты установки. Этот атрибут is_usable
теперь удален, и загрузчик "яиц" не работает во время выполнения, если не установлены инструменты установки.
Загрузчики шаблонов на основе файловой системы более точно улавливают исключения ¶
При использовании загрузчиков шаблонов filesystem.Loader
или app_directories.Loader
предыдущие версии Django генерировали ошибку, TemplateDoesNotExist
если источник шаблона существовал, но был нечитаемым. Это могло произойти при различных обстоятельствах, например, если у Django не было разрешений на открытие файла или если источником шаблона был каталог. С этого момента Django скрывает исключение только в том случае, если источник шаблона не существует. Во всех остальных случаях IOError
будет сгенерировано исходное исключение .
Перенаправления HTTP больше не обязательно должны быть абсолютными URI ¶
Относительные перенаправления больше не преобразуются в абсолютные URI. RFC 2616 требует, чтобы заголовокLocation
ответов перенаправления был абсолютным URI, но этот стандарт был замененRFC 7231, который разрешает относительные URILocation
, таким образом признавая реальную практику пользовательских агентов, почти все из которых принимают такой способ действий.
Следовательно, ожидаемые URL-адреса, передаваемые на, assertRedirects
как правило, больше не должны включать в себя часть URL-адресов схемы и домена. Например,
следует заменить на (если перенаправление специально не содержит абсолютный URL).self.assertRedirects(response, 'http://testserver/some-url/')
self.assertRedirects(response, '/some-url/')
В редком случае, когда вам нужно старое поведение (обнаруженное в старой версии Apache, где mod_scgi
относительное перенаправление интерпретируется как «внутреннее перенаправление»), вы можете восстановить его, написав специальное промежуточное ПО:
class LocationHeaderFix(object):
def process_response(self, request, response):
if 'Location' in response:
response['Location'] = request.build_absolute_uri(response['Location'])
return response
Прекращение поддержки PostgreSQL 9.0 ¶
Поддержка PostgreSQL 9.0 в апстрим-проектах закончилась в сентябре 2015 года. В результате Django 1.9 определила версию 1.9 как минимальную официально поддерживаемую версию PostgreSQL.
Прекращение поддержки Oracle 11.1 ¶
Поддержка Oracle 11.1 вышестоящим проектом закончилась в августе 2015 года. Таким образом, Django 1.9 определил версию 11.2 как минимальную официально поддерживаемую версию Oracle.
Удаление LoaderOrigin
и StringOrigin
шаблоны ¶
В предыдущих версиях Django при инициализации механизма шаблонов debug=True
экземпляр django.template.loader.LoaderOrigin
или django.template.base.StringOrigin
устанавливался в качестве исходного атрибута объекта шаблона. Эти классы были объединены, Origin
и теперь атрибут устанавливается всегда, независимо от настройки отладки движка. Для минимального уровня обратной совместимости старые имена классов будут сохраняться как псевдонимы нового класса Origin
до Django 2.0.
Изменения в конфигурации ведения журнала по умолчанию ¶
Чтобы упростить написание пользовательских конфигураций ведения журнала, стандартная конфигурация ведения журнала Django больше не определяет django.request
и
django.security
регистраторы. Вместо этого он определяет один django
регистратор, отфильтрованный на INFO
уровне, с двумя обработчиками:
console
: фильтруется наINFO
уровне и активен, только еслиDEBUG=True
.mail_admins
: фильтруется наERROR
уровне и активен, только еслиDEBUG=False
.
Если вы не переопределите ведение журнала Django по умолчанию, вы должны увидеть только минимальные изменения в поведении, но, например, вы можете увидеть некоторые новые сообщения в консоли runserver
.
Если вы переопределите ведение журнала Django по умолчанию, вам следует проверить, как ваша конфигурация объединяется с новыми значениями по умолчанию.
Подробности HttpRequest
в отчетах об ошибках ¶
Избыточно отображать полную информацию о запросе HttpRequest
всякий раз, когда он появлялся в виде переменной стека вызовов в HTML-версии страницы отладки и сообщения об ошибке. Таким образом, HTTP-запрос теперь отображается в том же стандартном представлении, что и другие переменные ( repr(request)
). В результате были удалены ExceptionReporterFilter.get_request_repr()
недокументированные метод и функция django.http.build_request_repr()
.
Содержимое текстовой версии электронного письма было изменено, чтобы обеспечить трассировку вызовов той же структуры, что и в случае запросов AJAX. Подробности трассировки вызовов производятся методом ExceptionReporter.get_traceback_text()
.
Удалены адаптеры и конвертеры глобального часового пояса для объектов даты и времени ¶
Django больше не регистрирует адаптеры или глобальные преобразователи для обработки информации о часовом поясе для значений, datetime
отправляемых в базу данных в качестве параметров запроса или считываемых из базы данных для результатов запроса. Это изменение влияет на проекты, отвечающие всем следующим условиям:
- Настройка
USE_TZ
содержитTrue
. - База данных - это SQLite, MySQL, Oracle или другая сторонняя база данных, которая не поддерживает часовые пояса. Если сомневаетесь, вы можете проверить значение
connection.features.supports_timezones
. - Код запрашивает базу данных вне ORM, обычно с помощью .
cursor.execute(sql, params)
Если вы передаете datetime
в такие запросы параметры часового пояса, вы должны превратить их в наивные даты / время в UTC:
from django.utils import timezone
param = timezone.make_naive(param, timezone.utc)
Если вы этого не сделаете, преобразование будет выполнено как в предыдущих версиях (с предупреждением об устаревании) до Django 1.11. Django 2.0 больше не будет выполнять преобразование, что может привести к повреждению данных.
Если вы прочитаете значения datetime
в результатах, они будут наивными, а не осознанными. Вы можете компенсировать это так:
from django.utils import timezone
value = timezone.make_aware(value, timezone.utc)
В этом нет необходимости, если вы запрашиваете базу данных через ORM, даже если вы используете запросы raw()
. ORM отвечает за управление информацией о часовом поясе.
Модули тегов шаблонов импортируются при настройке шаблонов ¶
Теперь движок DjangoTemplates
переходит к обнаружению шаблонных модулей маяков, установленных во время его создания. Это изменение позволяет библиотеки быть активированы явно с помощью ключа 'libraries'
из OPTIONS
в определении двигателя DjangoTemplates
. Возможные ошибки импорта или синтаксиса в модулях тегов шаблона приводят к быстрому сбою во время создания экземпляра, а не при первой компиляции шаблона с тегом .{% load %}
Удаление django.template.base.add_to_builtins()
¶
Несмотря на то, что это был частный API, проекты часто использовали его, add_to_builtins()
чтобы сделать теги шаблонов и фильтры доступными без необходимости использовать тег . Этот API формализован. Теперь проекты должны включать в себя библиотеку , используя ключ к при определении двигателя .{% load %}
'builtins'
OPTIONS
DjangoTemplates
Результат simple_tag
теперь всегда проходит через conditional_escape
¶
Как правило, теги шаблона не экранируют свое содержимое автоматически, и это поведение
задокументировано . Для таких тегов
inclusion_tag
это не проблема, потому что включенный шаблон будет выполнять автоматическое экранирование. Для assignment_tag()
вывода будет экранирован, когда он используется в качестве переменной в шаблоне.
Однако для предполагаемых случаев использования simple_tag
очень легко получить неверный HTML-код и, следовательно, создать риск XSS-уязвимости. Например :
@register.simple_tag(takes_context=True)
def greeting(context):
return "Hello {0}!".format(context['request'].user.first_name)
В предыдущих версиях Django это считалось XSS-уязвимостью, потому что от нее user.first_name
не удалось избежать.
В Django 1.9 это исправлено: если контекст шаблона имеет autoescape=True
(по умолчанию), simple_tag
результат функции тега будет передаваться как conditional_escape()
.
simple_tag
Вот несколько рекомендаций, которые помогут исправить теги :
- Любой код, создающий HTML, должен использовать либо систему шаблонов, либо
format_html()
. - Если результат тега
simple_tag
необходимо экранировать, используйтеescape()
илиconditional_escape()
. - Если вы абсолютно уверены, что создаете HTML-код из надежного источника (например, поля CMS, в котором хранится HTML-код, введенный администраторами), вы можете отметить его как таковой, используя
mark_safe()
.
Теги, соответствующие этим правилам, будут правильными и безопасными независимо от того, работают ли они с Django 1.9+ или более ранними версиями.
Paginator.page_range
¶
Paginator.page_range
теперь итератор вместо списка.
В версиях Django до 1.8 Paginator.page_range
возвращал объект list
в Python 2 и объект range
в Python 3. Django 1.8 по-прежнему возвращает список, но итератор более эффективен.
Существующий код, который зависит от конкретных функций объектов list
, таких как индексация, может позаботиться о преобразовании итератора в list
функцию list()
.
Неявное выполнение запроса __in
о QuerySet
удален ¶
В предыдущих версиях такие запросы, как:
Model.objects.filter(related_id=RelatedModel.objects.all())
были неявно преобразованы в:
Model.objects.filter(related_id__in=RelatedModel.objects.all())
который создал код SQL для стиля ."related_id IN (SELECT id FROM ...)"
__in
Неявная операция больше не выполняется, поэтому SQL «IN» теперь равен «=», и если подзапрос возвращает несколько результатов, большинство баз данных выдаст ошибку.
Браузеры, поддерживаемые contrib.admin
¶
Сайт администрирования больше не поддерживает версии Internet Explorer 8 и старше, так как срок службы этих браузеров официально закончился.
Изображения и стили CSS, поддерживающие Internet Explorer 6 и 7, были удалены. Значки PNG и GIF были заменены значками SVG, которые не поддерживаются Internet Explorer 8 или более ранними версиями.
Библиотека jQuery, встроенная в админку, была обновлена с версии 1.11.2 до 2.1.4. jQuery 2.x имеет тот же API, что и jQuery 1.x, но не поддерживает Internet Explorer 6, 7 или 8, что обеспечивает более высокую производительность и меньший размер файла. Если вам нужна поддержка IE8 и вы также должны использовать последнюю версию Django, вы можете заменить административную копию jQuery своей собственной, создав приложение Django с такой структурой:
app/static/admin/js/vendor/
jquery.js
jquery.min.js
SyntaxError
при установке Django setuptools 5.5.x ¶
При установке Django 1.9 или 1.9.1 с помощью setuptools 5.5.x вы увидите:
Compiling django/conf/app_template/apps.py ...
File "django/conf/app_template/apps.py", line 4
class {{ camel_case_app_name }}Config(AppConfig):
^
SyntaxError: invalid syntax
Compiling django/conf/app_template/models.py ...
File "django/conf/app_template/models.py", line 1
{{ unicode_literals }}from django.db import models
^
SyntaxError: invalid syntax
Эти ошибки можно игнорировать (Django все равно установится нормально), но вы можете избежать их, обновив setuptools до более новой версии. Если вы используете pip, вы можете обновить pip, используя который также обновит инструменты установки. Это решено в более поздних версиях Django, как описано в примечаниях к выпуску Django 1.9.2 .python -m pip install -U pip
Разное ¶
- Статические файлы jQuery
contrib.admin
перемещены вvendor/jquery
подкаталог. - Текст, отображаемый для пустых столбцов в
list_display
ячейках административного списка изменений, изменился с(None)
(или его переведенного эквивалента) на-
(тире). django.http.responses.REASON_PHRASES
иdjango.core.handlers.wsgi.STATUS_CODE_TEXT
были удалены. Вместо этого используйте Python stdlib:http.client.responses
для Python 3 и httplib.responses для Python 2.ValuesQuerySet
иValuesListQuerySet
были удалены.admin/base.html
Шаблон больше не устанавливаетwindow.__admin_media_prefix__
илиwindow.__admin_utc_offset__
. Ссылки на изображения в JavaScript, которые использовали это значение для создания абсолютных URL-адресов, были перемещены в CSS для упрощения настройки. Смещение UTC хранится в атрибуте данных<body>
тега.CommaSeparatedIntegerField
Валидация-была усовершенствована , чтобы запретить выгоды , как','
,',1'
и'1,,2'
.- Инициализация формы перенесена из
ProcessFormView.get()
метода в новыйFormMixin.get_context_data()
метод. Это может быть обратно несовместимым, если вы переопределилиget_context_data()
метод без вызоваsuper()
. - Поддержка PostGIS 1.5 прекращена.
- Поле
django.contrib.sites.models.Site.domain
было определено какunique
. - Чтобы обеспечить изоляцию тестов, запросы к базе данных больше не разрешены по умолчанию в
SimpleTestCase
тестах. Вы можете отключить это поведение, установивallow_database_queries
атрибут class вTrue
свой тестовый класс. ResolverMatch.app_name
был изменен, чтобы содержать полный путь пространства имен в случае вложенных пространств имен. Для согласованности сResolverMatch.namespace
пустым значением теперь является пустая строка вместоNone
.- Для усиления безопасности ключи сеанса должны содержать не менее 8 символов.
- Приватная функция
django.utils.functional.total_ordering()
удалена. Он содержал обходной путь дляfunctools.total_ordering()
ошибки в версиях Python старше 2.7.3. - Сериализация XML (через
dumpdata
или через структуру синдикации), используемая для вывода любых полученных символов. Теперь, если сериализуемый контент содержит какие-либо управляющие символы, недопустимые в стандарте XML 1.0, сериализация завершится ошибкой с расширениемValueError
. CharField
теперь по умолчанию удаляет ввод начальных и конечных пробелов. Это можно отключить, установив для новогоstrip
аргумента значениеFalse
.- Текст шаблона, который переведен и использует два или более последовательных знака процента, например
"%%"
, может иметь новыйmsgid
послеmakemessages
выполнения (скорее всего, перевод будет помечен как нечеткий). Новыйmsgid
будет отмечен ."#, python-format"
- Если ни
request.current_app
ниContext.current_app
не заданы,url
тег шаблона теперь будет использовать пространство имен текущего запроса. Установитеrequest.current_app
значение,None
если вы не хотите использовать подсказку пространства имен. SILENCED_SYSTEM_CHECKS
Установка в настоящее время заглушает сообщения всех уровней. РаньшеERROR
на консоль выводились сообщения уровня или выше.FlatPage.enable_comments
Поле удаляется из ,FlatPageAdmin
как он не используется приложением. Если ваш проект или стороннее приложение использует его, создайте собственный ModelAdmin, чтобы добавить его обратно.- Возвращаемое значение
setup_databases()
и первый аргументteardown_databases()
изменены. Раньше они были кортежами. Теперь они просто первый элемент .(old_names, mirrors)
old_names
- По умолчанию
LiveServerTestCase
пытается найти доступный порт в диапазоне 8081-8179 вместо того, чтобы просто пробовать порт 8081. - Система проверяет
ModelAdmin
теперь экземпляры, а не классы. - Частный API для применения смешанных планов миграции был удален из соображений производительности. Смешанные планы состоят из списка миграций, в которых одни применяются, а другие не применяются.
- Связанные классы дескрипторов объекта модели в
django.db.models.fields.related
(частный API) перемещаются изrelated
модуля вrelated_descriptors
и переименовываются следующим образом:ReverseSingleRelatedObjectDescriptor
являетсяForwardManyToOneDescriptor
SingleRelatedObjectDescriptor
являетсяReverseOneToOneDescriptor
ForeignRelatedObjectsDescriptor
являетсяReverseManyToOneDescriptor
ManyRelatedObjectsDescriptor
являетсяManyToManyDescriptor
- Если вы реализуете настраиваемое
handler404
представление, оно должно возвращать ответ с кодом состояния HTTP 404. ИспользуйтеHttpResponseNotFound
или переходитеstatus=404
наHttpResponse
. В противном случаеAPPEND_SLASH
сDEBUG=False
.
Функции, устаревшие в Django 1.9 ¶
assignment_tag()
¶
В Django 1.4 добавлен assignment_tag
помощник, упрощающий создание тегов шаблона, в которых результаты хранятся в переменной шаблона.
simple_tag()
Помощник приобрел такую же способность, что делает assignment_tag
устаревшими. Теги, которые используют,
assignment_tag
должны быть обновлены для использования simple_tag
.
{% cycle %}
синтаксис с аргументами, разделенными запятыми ¶
cycle
Тег поддерживает подчиненный старый синтаксис из предыдущих версий Django:
{% cycle row1,row2,row3 %}
Его синтаксический анализ вызвал ошибки с текущим синтаксисом, поэтому поддержка старого синтаксиса будет удалена в Django 1.10 после ускоренного прекращения поддержки.
ForeignKey
и OneToOneField
on_delete
аргумент ¶
Чтобы повысить осведомленность о каскадном удалении модели,
в Django 2.0 потребуется on_delete
аргумент ForeignKey
и OneToOneField
.
Обновите модели и существующие миграции, чтобы явно указать аргумент. Поскольку значение по умолчанию - models.CASCADE
добавить on_delete=models.CASCADE
ко всем
ForeignKey
и OneToOneField
s, которые не используют другой параметр. Вы также можете передать его в качестве второго позиционного аргумента, если вас не волнует совместимость со старыми версиями Django.
Field.rel
изменения ¶
Field.rel
и его методы и атрибуты были изменены, чтобы соответствовать API связанных полей. Field.rel
Атрибут переименован remote_field
и многие из его методов и атрибутов, либо изменить или переименовать.
Цель этих изменений - предоставить задокументированный API для полей отношений.
GeoManager
и GeoQuerySet
пользовательские методы ¶
Все пользовательские GeoQuerySet
методы ( area()
, distance()
, gml()
...) - были-были заменены географическими эквивалентными выражениями в аннотации (см новых функций). Следовательно, необходимость настраивать пользовательские GeoManager
модели для ГИС-моделей теперь устарела. Как только ваш код не вызывает ни одного из устаревших методов, вы можете просто удалить строки из своих моделей.objects = GeoManager()
Изменились API загрузчика шаблонов ¶
Загрузчики шаблонов Django были обновлены, чтобы разрешить рекурсивное расширение шаблона. Это изменение потребовало нового API загрузчика шаблонов. Старые
load_template()
и load_template_sources()
методы в настоящее время не рекомендуется. Подробности о новом API можно найти в документации загрузчика шаблонов .
Передача 3-кортеж или app_name
к include()
¶
Часть пространства имен экземпляра при передаче кортежа в качестве аргумента include()
была заменена передачей namespace
аргумента в include()
. Например:
polls_patterns = [
url(...),
]
urlpatterns = [
url(r'^polls/', include((polls_patterns, 'polls', 'author-polls'))),
]
СТАНОВИТСЯ:
polls_patterns = ([
url(...),
], 'polls') # 'polls' is the app_name
urlpatterns = [
url(r'^polls/', include(polls_patterns, namespace='author-polls')),
]
app_name
Аргумент include()
был заменен путем пропускания 2-кортеж (как указано выше), или передавая объект или модуль с app_name
атрибутом (как показано ниже). Если app_name
задано этим новым способом,
namespace
аргумент больше не требуется. По умолчанию будет установлено значение
app_name
. Например, шаблоны URL-адресов в руководстве изменены с:
urlpatterns = [
url(r'^polls/', include('polls.urls', namespace="polls")),
...
]
чтобы:
urlpatterns = [
url(r'^polls/', include('polls.urls')), # 'namespace="polls"' removed
...
]
app_name = 'polls' # added
urlpatterns = [...]
Это изменение также означает, что старый способ включения AdminSite
экземпляра устарел. Вместо этого перейдите admin.site.urls
непосредственно к
django.conf.urls.url()
:
from django.conf.urls import url
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
]
При установке пространства имен экземпляра требуется пространство имен приложения URL ¶
В прошлом пространство имен экземпляра без пространства имен приложения служило той же цели, что и пространство имен приложения, но было невозможно отменить шаблоны, если существовало пространство имен приложения с тем же именем. Включения, указывающие пространство имен экземпляра, требуют, чтобы включенный URLconf устанавливал пространство имен приложения.
current_app
параметр для contrib.auth
просмотров ¶
Все представления django.contrib.auth.views
имеют следующую структуру:
def view(request, ..., current_app=None, ...):
...
if current_app is not None:
request.current_app = current_app
return TemplateResponse(request, template_name, context)
Начиная с Django 1.8, current_app
устанавливается на request
объекте. Для обеспечения согласованности этих взглядов потребует абонента установить current_app
на
request
вместо того , чтобы передать его в отдельный аргумент.
django.contrib.gis.geoip
¶
В django.contrib.gis.geoip2
модуле аннулирует
django.contrib.gis.geoip
. Новый модуль предоставляет аналогичный API, за исключением того, что он не предоставляет устаревшие методы совместимости API GeoIP-Python.
Разное ¶
weak
Аргументdjango.dispatch.signals.Signal.disconnect()
является устаревшим , поскольку это не имеет никакого эффекта.- Этот
check_aggregate_support()
методdjango.db.backends.base.BaseDatabaseOperations
устарел и будет удален в Django 2.0.check_expression_support()
Вместо этого следует использовать более общие . django.forms.extras
устарела. Вы можете найтиSelectDateWidget
вdjango.forms.widgets
(или простоdjango.forms
) вместо этого.- Частный API
django.db.models.fields.add_lazy_relation()
устарел. django.contrib.auth.tests.utils.skipIfCustomUser()
Декоратор устарела. С изменениями обнаружения тестов в Django 1.6 тестыdjango.contrib
приложений больше не выполняются как часть проекта пользователя. Таким образом,@skipIfCustomUser
декоратор больше не нужен для оформления тестов вdjango.contrib.auth
.- Если вы настроили некоторые обработчики ошибок , сигнатуры представления только с одним параметром запроса устарели. Представления теперь также должны принимать второй
exception
позиционный параметр. django.utils.feedgenerator.Atom1Feed.mime_type
Иdjango.utils.feedgenerator.RssFeed.mime_type
атрибуты являются устаревшими в пользуcontent_type
.Signer
теперь выдает предупреждение, если используется недопустимый разделитель. Это станет исключением в Django 1.10.django.db.models.Field._get_val_from_obj()
устарел в пользуField.value_from_object()
.django.template.loaders.eggs.Loader
устарел как распространяющие приложения, так как яйца не рекомендуется.callable_obj
Ключевое слово аргументSimpleTestCase.assertRaisesMessage()
является устаревшим. Вместо этого передайте вызываемый объект как позиционный аргумент.allow_tags
Атрибут методовModelAdmin
является устаревшим. Используйтеformat_html()
,format_html_join()
илиmark_safe()
При создании возвращаемого значения метода INSTEAD.enclosure
Ключевое слово аргументSyndicationFeed.add_item()
является устаревшим. Используйте новыйenclosures
аргумент, который принимает списокEnclosure
объектов вместо одного.django.template.loader.LoaderOrigin
Иdjango.template.base.StringOrigin
псевдонимы дляdjango.template.base.Origin
осуждаются.
Функции удалены в 1.9 ¶
Эти функции достигли конца цикла устаревания и удалены в Django 1.9. См. « Устаревшие функции в 1.7» для получения подробной информации, в том числе о том, как отказаться от использования этих функций.
django.utils.dictconfig
устранен.django.utils.importlib
устранен.django.utils.tzinfo
устранен.django.utils.unittest
устранен.- Команда
syncdb
удалена. django.db.models.signals.pre_syncdb
иdjango.db.models.signals.post_syncdb
удаляется.- Поддержка
allow_syncdb
маршрутизаторов на базе данных удалена. - Убрана автоматическая синхронизация приложений без миграций. Миграция является обязательной для всех приложений, если вы не передадите эту
опцию.
migrate --run-syncdb
- Команды SQL для приложений управления без миграции,
sql
,sqlall
,sqlclear
,sqldropindexes
, иsqlindexes
, удаляются. - Удалена поддержка автоматической загрузки
initial_data
фикстур и исходных данных SQL. - Все модели должны быть определены внутри установленного приложения или объявлены явным
app_label
. Более того, их невозможно импортировать до загрузки приложения. В частности, невозможно импортировать модели внутри корневого пакета приложения. - Модель и форма
IPAddressField
удалены. Поле-заглушка остается для совместимости с историческими миграциями. AppCommand.handle_app()
больше не поддерживается.RequestSite
иget_current_site()
больше не импортируются изdjango.contrib.sites.models
.- Поддержка FastCGI через команду
runfcgi
управления удалена. django.utils.datastructures.SortedDict
устранен.ModelAdmin.declared_fieldsets
устранен.- Удаляются
util
модули, обеспечивающие обратную совместимость:django.contrib.admin.util
django.contrib.gis.db.backends.util
django.db.backends.util
django.forms.util
ModelAdmin.get_formsets
устранен.- Прокладки с обратной совместимостью, введенные для переименования
BaseMemcachedCache._get_memcache_timeout()
метода,get_backend_timeout()
удалены. --natural
И-n
опции дляdumpdata
удаляются.use_natural_keys
Аргументserializers.serialize()
удаляется.- Частный API
django.forms.forms.get_declared_fields()
удален. - Возможность использовать
SplitDateTimeWidget
withDateTimeField
удалена. WSGIRequest.REQUEST
Свойство удаляется.- Класс
django.utils.datastructures.MergeDict
удален. zh-cn
Иzh-tw
языковые коды удаляются.- Внутреннее
django.utils.functional.memoize()
удалено. django.core.cache.get_cache
устранен.django.db.models.loading
был удален.- Передача вызываемых аргументов в наборы запросов больше невозможна.
BaseCommand.requires_model_validation
удаляется в пользуrequires_system_checks
. Валидаторы администратора заменены проверками администратора.ModelAdmin.validator_class
Иdefault_validator_class
атрибуты удалены.ModelAdmin.validate()
устранен.django.db.backends.DatabaseValidation.validate_field
удален в пользуcheck_field
метода.- Команда
validate
управления удалена. django.utils.module_loading.import_by_path
удаляется в пользуdjango.utils.module_loading.import_string
.ssi
аurl
теги шаблонов удаляются изfuture
библиотеки тегов шаблонов.django.utils.text.javascript_quote()
устранен.- Параметры теста базы данных как независимые записи в параметрах базы данных с префиксом
TEST_
, больше не поддерживаются. cache_choices
ВариантModelChoiceField
иModelMultipleChoiceField
удаляется.- Значение
RedirectView.permanent
атрибута по умолчанию изменено сTrue
наFalse
. django.contrib.sitemaps.FlatPageSitemap
удаляется в пользуdjango.contrib.flatpages.sitemaps.FlatPageSitemap
.- Частный API
django.test.utils.TestTemplateLoader
был удален. - Модуль
django.contrib.contenttypes.generic
удален.