Примечания к выпуску Django 1.9¶
1 декабря 2015 г.
Добро пожаловать в Джанго 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.
Что нового в Джанго 1.9¶
Выполнение действий после фиксации транзакции¶
Новый хук on_commit() позволяет выполнять действия после успешной фиксации транзакции базы данных. Это полезно для таких задач, как отправка уведомлений по электронной почте, создание задач в очереди или аннулирование кешей.
Эта функциональность из пакета django-transaction-hooks была интегрирована в Django.
Проверка пароля¶
Django теперь предлагает проверку пароля, чтобы предотвратить использование пользователями слабых паролей. Проверка интегрирована в прилагаемые формы смены и сброса пароля и ее легко интегрировать в любой другой код. Проверка выполняется одним или несколькими валидаторами, настроенными в новом параметре AUTH_PASSWORD_VALIDATORS.
В Django включены четыре валидатора, которые могут обеспечить минимальную длину, сравнить пароль с атрибутами пользователя, такими как его имя, убедиться, что пароли не полностью числовые, или сверить их с включенным списком общих паролей. Вы можете объединить несколько валидаторов, а некоторые валидаторы имеют собственные параметры конфигурации. Например, вы можете предоставить собственный список общих паролей. Каждый валидатор предоставляет текст справки, объясняющий пользователю его требования.
По умолчанию проверка не выполняется и принимаются все пароли, поэтому, если вы не установите AUTH_PASSWORD_VALIDATORS, вы не увидите никаких изменений. В новых проектах, созданных с использованием шаблона startproject по умолчанию, включен простой набор валидаторов. Чтобы включить базовую проверку во включенных формах аутентификации вашего проекта, вы можете установить, например:
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",
},
]
Дополнительную информацию см. в разделе проверка пароля.
Миксины разрешений для представлений на основе классов¶
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, которые идеально смотрятся на экранах HiDPI. Он по-прежнему обеспечивает полнофункциональную работу с браузерами «А-класса YUI». В более старых браузерах могут наблюдаться различные уровни постепенного снижения производительности.
Параллельное выполнение тестов¶
Команда test теперь поддерживает опцию --parallel для параллельного запуска тестов проекта в нескольких процессах.
Каждый процесс получает свою собственную базу данных. Вы должны гарантировать, что разные тестовые примеры не будут иметь доступ к одним и тем же ресурсам. Например, тестовые примеры, затрагивающие файловую систему, должны создать временный каталог для собственного использования.
Эта опция включена по умолчанию для собственного набора тестов Django:
ОС поддерживает это (все, кроме Windows)
серверная часть базы данных поддерживает это (все встроенные серверные части, кроме Oracle)
Минорные изменения¶
django.contrib.admin¶
Представления администратора теперь имеют атрибуты model_admin или admin_site.
URL-адрес представления изменения администратора был изменен (по умолчанию он был
/admin/<app>/<model>/<pk>/, а теперь/admin/<app>/<model>/<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_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 <raster-data-source-objects>` из необработанных данных. Добавлены параметры настройки для таких свойств растра, как проекция или значения пикселей.
Для пользователей PostGIS новый
RasterFieldпозволяет хранить объекты GDALRaster. Он поддерживает автоматическое создание и перепроецирование пространственного индекса при сохранении модели. Он еще не поддерживает пространственные запросы.Новый метод
GDALRaster.warp()позволяет деформировать растр, указав свойства целевого растра, такие как начало координат, ширина, высота или размер пикселя (среди прочих).Новый метод
GDALRaster.transform()позволяет преобразовать растр в другую систему пространственной привязки, указав целевойsrid.Новый класс
GeoIP2позволяет использовать базы данных MaxMind GeoLite2, которые включают поддержку адресов IPv6.Версия библиотеки OpenLayers по умолчанию, включенная в виджеты, была обновлена с 2.13 до 2.13.1.
django.contrib.postgres¶
Добавлена поддержка поиска
rangefield.contained_byдля некоторых встроенных полей, соответствующих полям диапазона.Добавлен django.contrib.postgres.fields.JSONField.
Добавлена функция базы данных
TransactionNow.
django.contrib.sessions¶
Модель сеанса и классы SessionStore для бэкэндов db и cached_db подверглись рефакторингу, чтобы позволить пользовательскому бэкэнду сеанса базы данных основываться на них. Дополнительную информацию см. в разделе Использование базы данных для хранения сессии.
django.contrib.sites¶
get_current_site()теперь обрабатывает случай, когдаrequest.get_host()возвращаетdomain:port, например.example.com:80. Если поиск не удался из-за того, что хост не соответствует записи в базе данных и у хоста есть порт, порт удаляется и поиск повторяется только с доменной частью.
Кэш¶
django.core.cache.backends.base.BaseCacheтеперь имеет методget_or_set().django.views.decorators.cache.never_cache()теперь отправляет более убедительные заголовки (добавленno-cache, no-store, must-revalidateвCache-Control), чтобы лучше предотвратить кеширование. Это также было добавлено в Django 1.8.8.
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, позволяющий использовать символы Юникода в фрагментах.CharFieldтеперь принимает аргументstripдля удаления начальных и конечных пробелов из входных данных. Поскольку по умолчанию установлено значение «True», это поведение отличается от предыдущих выпусков.Поля формы теперь поддерживают аргумент
disabled, позволяющий отображать виджет поля отключенным браузерами.Теперь можно настраивать связанные поля, переопределяя метод поля
get_bound_field().
Общие представления¶
Представления на основе классов, созданные с помощью as_view(), теперь имеют атрибуты view_class и view_initkwargs.
method_decorator()теперь можно использовать со списком или кортежем декораторов. Его также можно использовать для украшения классов вместо методов <decorating-class-based-views>.
Интернационализация¶
Представление
django.views.i18n.set_language()теперь корректно перенаправляется на переведённые URL-адреса, если они доступны.Представление
django.views.i18n.javascript_catalog()теперь работает правильно, если оно используется несколько раз с разными конфигурациями на одной и той же странице.Функция
django.utils.timezone.make_aware()получила аргументis_dst, помогающий разрешать неоднозначное время во время перехода на летнее время.Теперь вы можете использовать варианты локали, поддерживаемые gettext. Обычно они используются для языков, которые могут быть написаны разными алфавитами, например латиницей и кириллицей (например,
be@latin).Добавлено представление 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), вы должны указать путь к конфигурации приложения, например:'polls.apps.PollsConfig'вINSTALLED_APPSдля его использования (вместо просто'опросов').При использовании серверной части PostgreSQL команда
dbshellможет подключиться к базе данных, используя пароль из вашего файла настроек (вместо того, чтобы требовать его ввода вручную).Пакет
djangoможет быть запущен как скрипт, напримерpython -m django, который будет вести себя так же, какdjango-admin.Команды управления, имеющие опцию
--noinput, теперь также используют--no-inputв качестве псевдонима для этой опции.
Миграции¶
Первоначальные миграции теперь помечаются атрибутом класса
initial = True, который позволяетmigrate --fake-initialболее легко обнаруживать начальные миграции.Добавлена поддержка сериализации экземпляров functools.partial и LazyObject.
При указании None в качестве значения в
MIGRATION_MODULESDjango будет считать приложение приложением без миграции.При применении миграций шаг «Состояния модели рендеринга», который отображается при выполнении миграции с уровнем детализации 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в одной и той же модели.Поиск даты и времениможет быть связан с другими поисками (например,exact,gt,ltи т. д.). Например:Entry.objects.filter(pub_date__month__gt=6).Поиск времени (часы, минуты, секунды) теперь поддерживается
TimeFieldдля всех баз данных. Поддержка бэкэндов, отличных от SQLite, была добавлена, но недокументирована в Django 1.7.Вы можете указать параметр
output_fieldагрегатаAvgдля агрегирования по нечисловым столбцам, таким какDurationField.Добавлен поиск
dateвDateTimeField, чтобы можно было запрашивать поле только по части даты.Добавлена функция базы данных
Now, которая возвращает текущую дату и время.Transformтеперь является подклассом Func(), который позволяет использоватьTransforms в правой части выражения, как обычныеFuncs. Это позволяет зарегистрировать некоторые функции базы данных, такие какLength,LowerиUpperкак преобразования.SlugFieldтеперь принимает аргументallow_unicode, позволяющий использовать символы Юникода в фрагментах.Добавлена поддержка ссылок на аннотации в QuerySet.distinct().
connection.queriesпоказывает запросы с замененными параметрами в SQLite.Выражения запроса теперь можно использовать при создании новых экземпляров модели с помощью
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()для получения исходного порта запроса.В
JsonResponseдобавлен параметрjson_dumps_params, чтобы разрешить передачу аргументов ключевого слова в вызовjson.dumps(), используемый для генерации ответа.BrokenLinkEmailsMiddlewareтеперь игнорирует ошибки 404, когда реферер равен запрошенному URL. Чтобы обойти уже реализованную проверку пустого реферера, некоторые веб-боты устанавливают реферер на запрошенный URL-адрес.
Шаблоны¶
Теги шаблонов, созданные с помощью помощника
simple_tag(), теперь могут сохранять результаты в переменной шаблона, используя аргументas.Добавлен метод
Context.setdefault().Был добавлен регистратор django.template, который включает следующие сообщения:
Сообщение уровня DEBUG об отсутствующих контекстных переменных.
Сообщение уровня
WARNINGдля неперехваченных исключений, возникающих во время рендеринга{% include %}, когда режим отладки выключен (полезно, поскольку{% include %}заглушает исключение и возвращает пустую строку).
Тег шаблона
firstofподдерживает сохранение вывода в переменной с использованием „as“.Context.update()теперь можно использовать в качестве менеджера контекста.Загрузчики шаблонов Django теперь могут рекурсивно расширять шаблоны.
Посмертный шаблон страницы отладки теперь включает выходные данные каждого установленного ядра.
Добавлена интеграция страниц отладки для пользовательских механизмов шаблонов.
Серверная часть
DjangoTemplatesполучила возможность явно регистрировать библиотеки и встроенные функции через шаблонOPTIONS.Фильтры «timesince» и «timeuntil» были улучшены для работы с високосными годами при больших временных интервалах.
Тег
includeтеперь кэширует проанализированные объекты шаблонов во время рендеринга шаблона, что ускоряет повторное использование в таких местах, как циклы for.
Тесты¶
Добавлен метод
json()для проверки ответов клиента и предоставления доступа к телу ответа в формате JSON.В тестовый клиент добавлен метод
force_login(). Используйте этот метод, чтобы имитировать эффект входа пользователя на сайт, пропуская этапы аутентификации и проверкиlogin().
URL-адреса¶
Утверждения обхода регулярных выражений теперь разрешены в шаблонах URL-адресов.
Пространство имен приложения теперь можно установить с помощью атрибута app_name во включенном модуле или объекте. Его также можно установить, передав кортеж из двух элементов (<список шаблонов>, <пространство имен приложения>) в качестве первого аргумента функции
include().Были добавлены системные проверки на предмет распространенных ошибок в шаблонах URL-адресов.
Валидаторы¶
Добавлен
django.core.validators.int_list_validator()для генерации валидаторов строк, содержащих целые числа, разделенные специальным символом.EmailValidatorтеперь ограничивает длину меток доменных имен до 63 символов на RFC 1034.Добавлен
validate_unicode_slug()для проверки фрагментов, которые могут содержать символы Юникода.
Изменения обратной несовместимости в версии 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().Чтобы использовать новый поиск по дате, сторонним базам данных может потребоваться реализация метода 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», то загрузчик будет молча игнорироваться. На практике это использовалось загрузчиком яиц только для определения того, установлены ли setuptools. Атрибут is_usable теперь удален, и вместо этого загрузчик яиц не работает во время выполнения, если setuptools не установлен.
Загрузчики шаблонов на основе файловой системы улавливают более конкретные исключения.¶
При использовании загрузчиков шаблонов filesystem.Loader или app_directories.Loader в более ранних версиях Django выдавалась ошибка TemplateDoesNotExist, если источник шаблона существовал, но был нечитаемым. Это могло произойти при многих обстоятельствах, например, если у Django не было разрешений на открытие файла или если источником шаблона был каталог. Теперь Django отключает исключение только в том случае, если источник шаблона не существует. Все остальные ситуации приводят к возникновению исходной ошибки IOError.
HTTP-перенаправления больше не требуют абсолютных URI.¶
Относительные перенаправления больше не преобразуются в абсолютные URI. RFC 2616 требовал, чтобы заголовок Location в ответах на перенаправление был абсолютным URI, но он был заменен RFC 7231, который допускает относительные URI в Location, признавая реальную практику пользовательских агентов, почти все из которых их поддерживают.
Следовательно, ожидаемые URL-адреса, передаваемые в assertRedirects, как правило, больше не должны включать схему и доменную часть URL-адресов. Например, self.assertRedirects(response, 'http://testserver/some-url/') следует заменить на self.assertRedirects(response, '/some-url/') (если только перенаправление не содержало абсолютный 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 устанавливает 9.1 в качестве минимальной версии PostgreSQL, которую он официально поддерживает.
Прекращена поддержка Oracle 11.1.¶
Восходящая поддержка Oracle 11.1 закончилась в августе 2015 года. Как следствие, Django 1.9 устанавливает 11.2 в качестве минимальной версии Oracle, которую он официально поддерживает.
Шаблоны LoaderOrigin и StringOrigin удалены.¶
В предыдущих версиях Django, когда механизм шаблонов инициализировался с отладкой как True, экземпляр django.template.loader.LoaderOrigin или django.template.base.StringOrigin устанавливался в качестве атрибута origin объекта шаблона. Эти классы были объединены в 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(), чтобы сделать теги и фильтры шаблона доступными без использования тега {% load %}. Этот API формализован. Проекты теперь должны определять встроенные библиотеки с помощью ключа '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 возвращал список в Python 2 и диапазон в Python 3. Django 1.8 постоянно возвращал список, но итератор более эффективен.
Существующий код, который зависит от конкретных функций списка, таких как индексирование, можно портировать путем преобразования итератора в список с помощью list().
Неявный поиск QuerySet __in удален.¶
В более ранних версиях такие запросы, как:
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 с помощью python -m pip install -U pip, который также обновит setuptools. Эта проблема решена в более поздних версиях Django, как описано в Примечания к выпуску Django 1.9.2.
Разнообразный¶
Статические файлы jQuery в
contrib.adminбыли перемещены в подкаталогvendor/jquery.Текст, отображаемый для пустых столбцов в ячейках списка изменений администратора
list_display, изменился с(None)(или его переведенного эквивалента) на-(тире).django.http.responses.REASON_PHRASESиdjango.core.handlers.wsgi.STATUS_CODE_TEXTбыли удалены. Вместо этого используйте стандартную библиотеку Python: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 значение 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) перемещены из модуля `` linked`` в `` linked_descriptors`` и переименованы следующим образом:ReverseSingleRelatedObjectDescriptor— этоForwardManyToOneDescriptorSingleRelatedObjectDescriptor— этоReverseOneToOneDescriptorForeignRelatedObjectsDescriptor— этоReverseManyToOneDescriptorManyRelatedObjectsDescriptor— этоManyToManyDescriptor
Если вы реализуете собственное представление
handler404, оно должно вернуть ответ с кодом состояния HTTP 404. ИспользуйтеHttpResponseNotFoundили передайтеstatus=404вHttpResponse. В противном случаеAPPEND_SLASHне будет работать корректно сDEBUG=False.
Функции, устаревшие в версии 1.9¶
assignment_tag()¶
В Django 1.4 добавлен помощник assignment_tag, упрощающий создание тегов шаблона, которые сохраняют результаты в переменной шаблона. Помощник simple_tag() получил ту же самую возможность, что сделало assignment_tag устаревшим. Теги, использующие assignment_tag, должны быть обновлены для использования simple_tag.
{% цикл %} синтаксис с аргументами, разделенными запятыми¶
Тег 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 и OneToOneFields, которые не используют другую опцию. Вы также можете передать его в качестве второго позиционного аргумента, если вас не волнует совместимость со старыми версиями 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 можно найти в документации по загрузчику шаблонов.
Передача кортежа из трех или 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() был заменен передачей двухкортежа (как указано выше) или передачей объекта или модуля с атрибутом app_name (как показано ниже). Если app_name установлено таким новым способом, аргумент namespace больше не требуется. По умолчанию будет установлено значение app_name. Например, шаблоны URL-адресов в руководстве изменены с:
mysite/urls.py¶urlpatterns = [url(r"^polls/", include("polls.urls", namespace="polls")), ...]
к:
mysite/urls.py¶urlpatterns = [
url(r"^polls/", include("polls.urls")), # 'namespace="polls"' removed
...,
]
polls/urls.py¶app_name = "polls" # added
urlpatterns = [...]
Это изменение также означает, что старый способ включения экземпляра AdminSite устарел. Вместо этого передайте admin.site.urls непосредственно в django.conf.urls.url():
urls.py¶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 в запросе вместо того, чтобы передавать его в отдельном аргументе.
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.
Если вы настроили некоторые обработчики ошибок, подписи представлений только с одним параметром запроса считаются устаревшими. Представления теперь также должны принимать второй позиционный параметр «исключение».
Атрибуты
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()при построении возвращаемого значения метода.Аргумент ключевого слова
enclosureдляSyndictionFeed.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.utildjango.contrib.gis.db.backends.utildjango.db.backends.utildjango.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 с DateTimeField удалена.
Свойство 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 удален.