• 3.2
  • 5.0
  • 6.1
  • Версия документации: 3.1

Примечания к выпуску Django 1.9

1 декабря 2015 г.

Добро пожаловать в Джанго 1.9!

Эти примечания к выпуску охватывают новые функции, а также некоторые обратно несовместимые изменения, о которых вам следует знать при обновлении с Django 1.8 или более ранних версий. Мы отменили некоторые функции, цикл устаревания которых достиг конца, и мы начали процесс прекращения поддержки некоторых функций.

См. руководство Upgrading Django to a newer version, если вы обновляете существующий проект.

Совместимость версий Python

Для Django 1.9 требуется Python 2.7, 3.4 или 3.5. Мы настоятельно рекомендуем и официально поддерживаем только последнюю версию каждой серии.

Серия Django 1.8 — последняя, ​​поддерживающая Python 3.2 и 3.3.

Что нового в Джанго 1.9

Выполнение действий после фиксации транзакции

Новый хук on_commit() позволяет выполнять действия после успешной фиксации транзакции базы данных. Это полезно для таких задач, как отправка уведомлений по электронной почте, создание задач в очереди или аннулирование кешей.

This functionality from the django-transaction-hooks package has been integrated into 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

django.contrib.gis

  • Все методы GeoQuerySet устарели и заменены эквивалентными функциями базы данных. Как только устаревшие методы будут заменены в вашем коде, вы даже сможете удалить специальный GeoManager из ваших классов с поддержкой ГИС.

  • Интерфейс GDAL теперь поддерживает создание экземпляров файловых и хранящихся в памяти объектов GDALRaster <raster-data-source-objects>` из необработанных данных. Добавлены параметры настройки для таких свойств растра, как проекция или значения пикселей.

  • Для пользователей PostGIS новый RasterField позволяет хранить объекты GDALRaster. Он поддерживает автоматическое создание и перепроецирование пространственного индекса при сохранении модели. Он еще не поддерживает пространственные запросы.

  • The new GDALRaster.warp() method allows warping a raster by specifying target raster properties such as origin, width, height, or pixel size (amongst others).

  • Новый метод GDALRaster.transform() позволяет преобразовать растр в другую систему пространственной привязки, указав целевой srid.

  • Новый класс GeoIP2 позволяет использовать базы данных MaxMind GeoLite2, которые включают поддержку адресов IPv6.

  • Версия библиотеки OpenLayers по умолчанию, включенная в виджеты, была обновлена ​​с 2.13 до 2.13.1.

django.contrib.postgres

django.contrib.sessions

  • Модель сеанса и классы SessionStore для бэкэндов db и cached_db подверглись рефакторингу, чтобы позволить пользовательскому бэкэнду сеанса базы данных основываться на них. Дополнительную информацию см. в разделе Использование базы данных для хранения сессии.

django.contrib.sites

  • get_current_site() теперь обрабатывает случай, когда request.get_host() возвращает domain:port, например. example.com:80. Если поиск не удался из-за того, что хост не соответствует записи в базе данных и у хоста есть порт, порт удаляется и поиск повторяется только с доменной частью.

django.contrib.syndicate

  • Добавлена ​​поддержка нескольких вложений для каждого элемента фида. Если в RSS-канале определено несколько вложений, возникает исключение, поскольку RSS-каналы, в отличие от каналов Atom, не поддерживают несколько вложений для каждого элемента канала.

Кэш

  • 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 now calls xgettext once per locale directory rather than once per translatable file. This speeds up localization builds.

  • 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_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 в одной и той же модели.

  • Поиск даты и времени может быть связан с другими поисками (например, 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(), который позволяет использовать 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 template loaders previously required an is_usable attribute to be defined. If a loader was configured in the template settings and this attribute was False, the loader would be silently ignored. In practice, this was only used by the egg loader to detect if setuptools was installed. The is_usable attribute is now removed and the egg loader instead fails at runtime if setuptools is not installed.

Загрузчики шаблонов на основе файловой системы улавливают более конкретные исключения.

При использовании загрузчиков шаблонов 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 и более ранними версиями.

The jQuery library embedded in the admin has been upgraded from version 1.11.2 to 2.1.4. jQuery 2.x has the same API as jQuery 1.x, but does not support Internet Explorer 6, 7, or 8, allowing for better performance and a smaller file size. If you need to support IE8 and must also use the latest version of Django, you can override the admin’s copy of jQuery with your own by creating a Django application with this structure:

app/static/admin/js/vendor/
    jquery.js
    jquery.min.js

SyntaxError when installing Django setuptools 5.5.x

When installing Django 1.9 or 1.9.1 with setuptools 5.5.x, you’ll see:

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

It’s safe to ignore these errors (Django will still install just fine), but you can avoid them by upgrading setuptools to a more recent version. If you’re using pip, you can upgrade pip using python -m pip install -U pip which will also upgrade setuptools. This is resolved in later versions of Django as described in the Примечания к выпуску Django 1.9.2.

Разнообразный

  • Статические файлы jQuery в contrib.admin были перемещены в подкаталог vendor/jquery.

  • Текст, отображаемый для пустых столбцов в ячейках списка изменений администратора list_display, изменился с (None) (или его переведенного эквивалента) на - (тире).

  • django.http.responses.REASON_PHRASES and django.core.handlers.wsgi.STATUS_CODE_TEXT have been removed. Use Python’s stdlib instead: http.client.responses for Python 3 and httplib.responses for 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 — это ForwardManyToOneDescriptor

    • SingleRelatedObjectDescriptor — это ReverseOneToOneDescriptor

    • ForeignRelatedObjectsDescriptor — это ReverseManyToOneDescriptor

    • ManyRelatedObjectsDescriptor — это 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

All views in django.contrib.auth.views have the following structure:

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.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 с 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 удален.

Back to Top