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

1 декабря 2015 г.

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

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

См. « Обновление Django до новой версии», если вы обновляете существующий проект.

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

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

Последняя серия Django 1.8 поддерживает Python 3.2 и 3.3.

Что нового в Django 1.9

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

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

Эта функция из пакета django-transaction-hooks была интегрирована в Django.

Проверка паролей

Django теперь предлагает проверку пароля, чтобы предотвратить использование слабых паролей пользователями. Проверка встроена в формы изменения и сброса пароля и легко интегрируется в любой другой код. Проверка выполняется одним или несколькими валидаторами, настроенными в новой настройке AUTH_PASSWORD_VALIDATORS .

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

По умолчанию проверка не выполняется и принимаются все пароли. Если вы не добавите контент AUTH_PASSWORD_VALIDATORS , вы не увидите никаких изменений. В новых проектах, созданных с использованием шаблона по startproject умолчанию, включен простой набор валидаторов. Чтобы включить базовую проверку в формах аутентификации Django в вашем проекте, вы можете определить, например:

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]

Подробнее см. Проверка паролей .

Классы разрешений Mixins в представлениях на основе классов

Django теперь поставляется с классами подмешать AccessMixin , LoginRequiredMixin , PermissionRequiredMixin и UserPassesTestMixin для обеспечения функциональных возможностей django.contrib.auth.decorators для представлений , основанных на классах. Эти классы взяты из проекта django-braces или вдохновлены им .

Однако между реализациями Django и django-braces ” есть несколько различий :

  • Атрибут raise_exception может быть только True или False . Исключения или настраиваемые исполняемые объекты не поддерживаются.
  • Метод handle_no_permission() не принимает никаких параметров request . Текущий запрос доступен в формате self.request .
  • Пользовательская функция test_func() из UserPassesTestMixin не принимает какого - либо параметра user . Текущий запрос доступен в формате self.request.user .
  • Атрибут permission_required принимает строку (определяющую одно разрешение) или список строк (определяя несколько разрешений), которые должны быть предоставлены для разрешения доступа.
  • Новый атрибут permission_denied_message позволяет передать сообщение об исключении PermissionDenied .

Новый стиль для contrib.admin

Интерфейс администратора имеет новый, современный, солидный вид с новыми значками SVG, которые отлично смотрятся на экранах с высокой плотностью пикселей. Это всегда гарантирует полнофункциональную работу с браузерами YUI A-level . Старые браузеры иногда могут работать в приемлемом ухудшенном режиме.

Параллельное выполнение тестов

Теперь test команда поддерживает --parallel возможность параллельного запуска тестов проекта в нескольких процессах.

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

Эта опция включена по умолчанию для собственного набора тестов Django, если:

  • операционная система поддерживает его (все кроме Windows)
  • ядро базы данных поддерживает его (все встроенные движки, кроме Oracle)

Незначительные особенности

django.contrib.admin

  • Административные представления теперь имеют атрибуты model_admin или admin_site .
  • URL-адрес для просмотра редактирования сайта администрирования был изменен (по /admin/<app>/<modèle>/<pk>/ умолчанию на /admin/<app>/<modèle>/<pk>/change/ ). Это не должно повлиять на ваше приложение, если у вас нет жестко заданных URL-адресов администратора. В этом случае рекомендуется заменить эти ссылки на обратное разрешение URL-адресов администратора . Обратите внимание, что старый URL-адрес по-прежнему перенаправляется на новый из-за обратной совместимости, но это может прекратиться в будущей версии.
  • ModelAdmin.get_list_select_related() был добавлен, чтобы разрешить изменение значений, select_related() используемых в запросе списка для модификации сайта администрирования согласно запросу.
  • В available_apps метод добавлена контекстная переменная , которая содержит список приложений, доступных текущему пользователю AdminSite.each_context() .
  • AdminSite.empty_value_display и ModelAdmin.empty_value_display были добавлены для отмены отображения пустых значений в списке для модификации сайта администрирования. Также можно настроить значение для каждого поля.
  • События JQuery были добавлены при добавлении или удалении подчиненной формы на странице, содержащей форму редактирования.
  • Компонент выбора времени включает опцию «18:00» для согласования с наличием предопределенных опций каждые 6 часов.
  • Генерация ярлыков в JavaScript теперь поддерживает румынские символы.

django.contrib.admindocs

  • В разделе моделей admindocs теперь также описаны методы, которые принимают параметры, а не игнорируют их.

django.contrib.auth

  • По умолчанию количество итераций хеширования пароля PBKDF2 увеличено на 20%. Это изменение с обратной совместимостью не влияет на тех, кто создал подкласс django.contrib.auth.hashers.PBKDF2PasswordHasher для изменения значения по умолчанию.
  • Теперь класс BCryptSHA256PasswordHasher обновляет пароли при изменении его атрибута rounds .
  • AbstractBaseUser и BaseUserManager были перенесены в новый модуль , django.contrib.auth.base_user так что они могут быть импортированы без необходимости включения django.contrib.auth в INSTALLED_APPS (который сгенерировал предупреждение устаревания в старых версиях и больше не поддерживается , так как Django 1.9).
  • Параметр permission из permission_required() принимает все варианты итерации элементов, а не только списков и кортежей.
  • Новый класс PersistentRemoteUserMiddleware позволяет использовать REMOTE_USER в конфигурациях, где этот заголовок вводится только на страницах подключения, а не в других запросах сеанса.
  • Представление django.contrib.auth.views.password_reset() принимает extra_email_context параметр.

django.contrib.contenttypes

  • Теперь можно использовать order_with_respect_to с отношением GenericForeignKey .

django.contrib.gis

  • Все методы GeoQuerySet устарели и заменены эквивалентными функциями базы данных . Как только старые методы будут заменены в вашем коде, появится возможность удалить специальный менеджер GeoManager классов вашей географической модели.
  • Интерфейс GDAL теперь поддерживает создание экземпляров файловых объектов и объектов GDALRaster в памяти из необработанных данных. Теперь можно изменять свойства матрицы, такие как проекция или значения пикселей.
  • Для пользователей PostGIS новое поле RasterField позволяет хранить объекты GDALRaster . Он поддерживает автоматическое создание пространственного индекса и перепроецирование при сохранении модели. Он еще не поддерживает пространственный запрос.
  • Новый метод GDALRaster.warp() позволяет искажать структуру матрицы, задавая целевые свойства, такие как начало координат, ширина, высота или размер пикселя (среди прочего).
  • Новый метод GDALRaster.transform() позволяет преобразовать матричную структуру в другую систему пространственной привязки, указав srid целевой код .
  • Новый класс GeoIP2 позволяет использовать базы данных MaxMind GeoLite2, которые включают поддержку адресов IPv6.
  • Версия библиотеки OpenLayers по умолчанию, включенная в виджеты, была обновлена ​​с 2.13 до 2.13.1.

django.contrib.postgres

django.contrib.sessions

  • Модель сессии и классы SessionStore для двигателей db и cached_db были переработаны , чтобы пользовательские базы данных управляемой сессии двигатель будет построен на них. Дополнительные сведения см. В разделе « Расширение механизмов сеансов, управляемых базой данных».

django.contrib.sites

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

django.contrib.syndication

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

Кэш

  • django.core.cache.backends.base.BaseCache теперь есть метод get_or_set() .
  • django.views.decorators.cache.never_cache() теперь отправляет более убедительные заголовки ( были добавлены ), чтобы лучше предотвратить кеширование. Это также было добавлено в Django 1.8.8.no-cache, no-store, must-revalidate Cache-Control

CSRF

  • Имя заголовка запроса, используемое для проверки подлинности CSRF, можно настроить с помощью CSRF_HEADER_NAME .
  • Заголовок реферера CSRF теперь проверяется на основе настройки, CSRF_COOKIE_DOMAIN если он установлен. Для получения более подробной информации см. « Операция» .
  • Новый параметр CSRF_TRUSTED_ORIGINS предоставляет возможность разрешать небезопасные (например POST ) запросы из разных источников по HTTPS.

Ядра баз данных

  • Движок PostgreSQL ( django.db.backends.postgresql_psycopg2 ) также доступен как django.db.backends.postgresql . Старое имя будет по-прежнему доступно для обратной совместимости.

Файловое хранилище

  • Storage.get_valid_name() теперь вызывается, когда upload_to является исполняемым объектом.
  • File теперь есть метод seekable() с Python 3.

Формы

  • ModelForm принимает новую опцию Meta field_classes для настройки типов полей. См. Дополнительные сведения в разделе « Перегрузка полей по умолчанию» .
  • Теперь вы можете установить порядок отображения полей формы с помощью атрибута field_order , параметра конструктора field_order или метода order_fields() .
  • Префикс формы можно определить в классе формы, а не только при создании экземпляра формы. Подробнее см. Префиксы форм .
  • Теперь вы можете определить именованные параметры , которые хотите передать конструктору формы в наборе форм.
  • SlugField теперь принимает параметр, allow_unicode разрешающий использование символов Unicode в «кратких заголовках».
  • CharField теперь принимает параметр strip для очистки введенных данных от любых начальных или конечных пробелов. True Поэтому по умолчанию поведение отличается от предыдущих версий.
  • Поля формы теперь принимают параметр, disabled который заставляет отключенный компонент поля отображаться в браузерах.
  • Теперь можно настроить поля формы, связанные с данными, путем перегрузки метода get_bound_field() .

Общие представления

  • Созданные к as_view() настоящему времени представления на основе классов имеют атрибуты view_class и view_initkwargs .
  • method_decorator() теперь можно использовать со списком или кортежем декораторов. Вы также можете использовать его для украшения классов вместо методов .

Интернационализация

  • Теперь представление django.views.i18n.set_language() правильно перенаправляет на переведенные URL-адреса, если они доступны.
  • Представление django.views.i18n.javascript_catalog() теперь работает правильно, если используется несколько раз с разными конфигурациями на одной странице.
  • Функция django.utils.timezone.make_aware() имеет новый параметр, is_dst помогающий разрешить неоднозначное время при переходе на летнее / зимнее время.
  • Теперь можно использовать языковые варианты, поддерживаемые gettext. Как правило, они используются для языков, написанных с использованием разных шрифтов, например, латиницы и кириллицы (например, [email protected] ).
  • Добавлен django.views.i18n.json_catalog() вид, помогающий создать настраиваемую клиентскую библиотеку i18n на основе переводов Django. Он возвращает объект JSON, содержащий каталог переводов, настройки форматирования и правило множественного числа.
  • Атрибут name_translated был добавлен к объекту, возвращенному тегом шаблона get_language_info . Также был добавлен аналогичный шаблонный фильтр language_name_translated .
  • Теперь вы можете запустить compilemessages проект из корневого каталога, и он найдет все файлы сообщений, созданные с помощью makemessages .
  • makemessages теперь вызывает xgettext один раз для каждого языкового каталога, а не один раз для каждого переводимого файла. Это ускоряет создание каталогов переводов.
  • blocktrans позволяет вам приписать свой результат переменной с помощью asvar .
  • Доступны два новых языка: колумбийский испанский и шотландский гэльский.

Команды администрирования

  • Новая команда sendtestemail позволяет отправить тестовое электронное письмо, чтобы легко убедиться, что отправка писем через Django работает.
  • Чтобы улучшить читаемость кода SQL, сгенерированного командой sqlmigrate , коду SQL, сгенерированному для каждой операции миграции, предшествует описание операции.
  • Результат команды dumpdata теперь упорядочен детерминированно. Кроме того, если --output задана опция , команда также отображает индикатор выполнения в терминале.
  • Теперь команда createcachetable предлагает возможность --dry-run отображать код SQL вместо его выполнения.
  • Команда startapp создает файл apps.py . Поскольку он не содержит default_app_config ( нежелательный API ), вам необходимо указать путь к конфигурации приложения INSTALLED_APPS , например 'polls.apps.PollsConfig' , для конфигурации, которая будет использоваться (вместо простой 'polls' ).
  • С движком PostgreSQL команда dbshell может подключаться к базе данных, используя пароль из файла настроек (вместо того, чтобы вводить его вручную).
  • Пакет django может быть выполнен как сценарий, например , который будет вести себя так же, как .python -m django django-admin
  • Административные команды с этой опцией --noinput теперь также принимают --no-input эту опцию как псевдоним.

Миграции

  • Начальные миграции теперь отмечены атрибутом класса, который позволяет более легко обнаруживать начальные миграции.initial = True migrate --fake-initial

  • Поддержка сериализации экземпляров functools.partial и LazyObject была добавлена.

  • При указании значения None для элемента в MIGRATION_MODULES Django предполагает, что это приложение не имеет миграции.

  • При применении миграций шаг «визуализировать состояния модели», который появляется при выполнении миграций с подробностью 2 или выше, теперь вычисляет только состояния миграций, которые уже были применены. Модельные отчеты о внутрипроцессных миграциях создаются по запросу, что резко снижает объем необходимой памяти.

    Однако это улучшение недоступно при обращении миграций, и в этом случае по-прежнему необходимо предварительно вычислить и сохранить состояния промежуточных миграций.

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

  • Теперь команда squashmigrations принимает возможность указать начальную миграцию, из которой будут объединены миграции.

Модели

  • QuerySet.bulk_create() теперь также работает для моделей прокси.
  • Конфигурация базы данных содержит новую опцию TIME_ZONE для взаимодействия с базами данных , которые хранят даты / время в местное время и которые не поддерживает часовые пояса , когда это USE_TZ стоит True .
  • Метод RelatedManager.set() был добавлен к менеджерам отношений, созданным полями ForeignKey , GenericForeignKey и ManyToManyField .
  • Метод add() на противоположной стороне внешнего ключа теперь имеет параметр, bulk разрешающий выполнение одного запроса независимо от количества добавляемых объектов, вместо того, чтобы требовать одного запроса для каждого объекта.
  • Параметр keep_parents был добавлен, чтобы Model.delete() разрешить удаление только «дочерних» данных из модели, наследуемой от других таблиц.
  • Model.delete() и QuerySet.delete() вернуть количество удаленных объектов.
  • Была добавлена ​​проверка системы, чтобы предотвратить установку как для одной Meta.ordering и order_with_respect_to той же модели.
  • Допросы могут следовать другие вопросы (например , , и т.д.). Например, .date et d'heure exact gt lt Entry.objects.filter(pub_date__month__gt=6)
  • Опросы времени (часы, минуты, секунды) теперь поддерживаются TimeField для всех движков баз данных. За исключением SQLite, эти запросы уже были доступны, начиная с Django 1.7, но не документированы.
  • Параметр output_field был добавлен, чтобы разрешить агрегацию Avg по нечисловым столбцам, например DurationField .
  • Запрос date был добавлен в , DateTimeField чтобы запрашивать поле только даты части.
  • Добавлены функции базы данных Greatest и Least .
  • Добавлена ​​функция базы данных Now ; это возвращает текущую дату и время.
  • Transform теперь является подклассом Func () , который позволяет использовать объекты Transform в правой части выражения, как Func обычные объекты . Это позволяет определенные функции базы данных для регистрации в качестве Length , Lower а Upper также преобразования.
  • SlugField теперь принимает параметр, allow_unicode разрешающий использование символов Unicode в «кратких заголовках».
  • Теперь можно ссылаться на аннотации в QuerySet.distinct() .
  • С помощью SQLite connection.queries отображайте запросы с подставленными параметрами.
  • В выражении запроса теперь может быть использовано при создании новых моделей с кузовами save() , create() и bulk_create() .

Запросы и ответы

  • Пока это HttpResponse.reason_phrase не установлено явно, его значение теперь определяется текущим значением HttpResponse.status_code . При изменении status_code за пределами конструктора также изменяется значение reason_phrase .
  • В представлении отладки теперь отображаются сведения о строке исключения в Python 3.
  • Представления ошибок 40x по умолчанию теперь принимают второй позиционный параметр, исключение, вызвавшее ошибку.
  • Обработчики теперь поддерживают представления ошибок TemplateResponse , которые обычно используются с представлениями на основе классов.
  • Исключения, генерируемые методом render() , теперь также передаются методу process_exception() каждого промежуточного программного обеспечения.
  • По промежуточного слоя запросов теперь можно установить HttpRequest.urlconf для None отмены любых изменений, внесенных предыдущим промежуточным ПО, и возврата к ROOT_URLCONF исходному состоянию.
  • Управления DISALLOWED_USER_AGENTS в CommonMiddleware настоящее бросает исключение PermissionDenied вместо того , HttpResponseForbidden так что вид handler403 называется.
  • HttpRequest.get_port() был добавлен для получения исходного порта запроса.
  • Параметр json_dumps_params был добавлен, чтобы JsonResponse разрешить передачу именованных параметров вызову, json.dumps() используемому для создания ответа.
  • Промежуточное ПО BrokenLinkEmailsMiddleware теперь игнорирует ошибки 404, если реферер равен запрошенному URL. Чтобы обойти уже реализованную проверку пустого реферера, некоторые веб-роботы устанавливают для реферера то же значение, что и запрошенный URL.

Шаблоны

  • Теги шаблона, созданные с помощью этой утилиты, simple_tag() теперь могут сохранять свой результат в переменной шаблона с помощью параметра as .
  • Метод Context.setdefault() был добавлен.
  • Django.template регистратор был добавлен и получает следующие сообщения:
    • Сообщение уровня DEBUG для отсутствующих переменных контекста.
    • Сообщение уровня WARNING для неперехваченных исключений, генерируемых при рендеринге тега, когда режим отладки отключен (полезно, поскольку заглушает исключение и возвращает пустую строку).{% include %} {% include %}
  • Тег шаблона firstof позволяет сохранять результат в переменной с расширением as .
  • Context.update() теперь можно использовать как диспетчер контекста.
  • Загрузчики шаблонов Django теперь могут рекурсивно расширять шаблоны.
  • Шаблон «postmortem» на странице отладки теперь включает результат для каждого установленного механизма шаблонов.
  • Добавлена ​​« интеграция страницы отладки для пользовательских шаблонизаторов.
  • Теперь можно явно регистрировать библиотеки и встроенные элементы для движка с DjangoTemplates помощью настройки шаблона OPTIONS .
  • Фильтры timesince и timeuntil были улучшены для учета високосных лет для больших интервалов времени.
  • Тег include теперь кэширует объекты шаблона, отсканированные в процессе визуализации шаблона, ускоряя повторное использование в таких местах, как циклы for .

Тесты

  • Этот метод json() был добавлен для тестирования ответов клиентов, чтобы обеспечить доступ к телу ответа в формате JSON.
  • Метод force_login() добавлен в тестовый клиент. Используйте этот метод, чтобы имитировать эффект входа пользователя на сайт, избегая прохождения этапов аутентификации и проверки login() .

URL

  • Утверждения поиска теперь разрешены в регулярных выражениях шаблонов URL.
  • Теперь пространство имен приложения можно задать с помощью app_name атрибута во включенном модуле или объекте. Его также можно установить, передав кортеж из 2 (<список шаблонов>, <пространство имен приложения>) в качестве первого аргумента в include() .
  • Добавлены системные проверки на предмет распространенных ошибок в шаблонах URL.

Валидаторы

  • django.core.validators.int_list_validator() был добавлен для генерации строковых валидаторов, содержащих целые числа, разделенные настраиваемым символом.
  • EmailValidator отныне ограничивает длину частей доменных имен до 63 символов, в соответствии с RFC 1034 .
  • validate_unicode_slug() был добавлен для проверки «ярлыков», которые могут содержать символы Unicode.

Изменения, несовместимые со старыми версиями в Django 1.9

Предупреждение

В дополнение к изменениям, подробно описанным в этом разделе, обязательно ознакомьтесь с функциями, удаленными в версии 1.9, с указанием функций, которые завершили цикл устаревания и поэтому были удалены. Если вы не обновили свой код в течение времени, разрешенного периодом устаревания определенной функции, ее удаление может выглядеть как изменение, несовместимое со старыми версиями.

API ядра СУБД

  • Некоторые новые тесты полагаются на способность движка проверять значения столбцов по умолчанию (возвращая результат в Field.default ). Вы можете установить функциональность базы данных can_introspect_default для False если ваш двигатель не позволяет этот самоанализ. Вы можете ознакомиться с реализацией движков, включенных в Django, для справки ( # 24245 ).

  • Не рекомендуется регистрировать глобальный адаптер или преобразователь на уровне модуля DB-API для обработки информации о часовом поясе значений, datetime передаваемых в качестве параметров запроса или возвращаемых в качестве результатов запроса с базами данных, которые не поддерживают часовые пояса. Это может вызвать конфликты с другими библиотеками.

    Рекомендуемый способ добавить часовой пояс к значениям, datetime полученным из базы данных, - это зарегистрировать преобразователь для полей DateTimeField в DatabaseOperations.get_db_converters() .

    Функциональность базы данных needs_datetime_string_cast была удалена. Механизмы базы данных, которые его определяют, должны вместо этого зарегистрировать преобразователь, как описано выше.

  • Методы DatabaseOperations.value_to_db_<type>() были переименованы adapt_<type>field_value() для единообразия с методами convert_<type>field_value() .

  • Чтобы использовать новый запрос date , сторонним механизмам баз данных может потребоваться реализовать этот метод DatabaseOperations.datetime_cast_date_sql() .

  • Метод DatabaseOperations.time_extract_sql() был добавлен. Он вызывает существующий метод date_extract_sql() . Этот метод перегружен механизмом SQLite для добавления ежечасных запросов (час, минута, секунда) в поля TimeField . Некоторым сторонним механизмам баз данных может потребоваться сделать то же самое.

  • Метод DatabaseOperations.datetime_cast_sql() (не путать с DatabaseOperations.datetime_cast_date_sql() упомянутым выше) был удален. Этот метод использовался для форматирования дат в Oracle задолго до версии 1.0, но не был перегружен другими встроенными механизмами в течение многих лет и не вызывался из других мест в мире. код или тесты Django.

  • Для поддержки распараллеливания тестов метод должен быть реализован DatabaseCreation._clone_test_db() и определен . Может потребоваться корректировка .DatabaseFeatures.can_clone_databases = True DatabaseCreation.get_test_db_clone_settings()

Настройки по умолчанию, которые были кортежами, теперь представлены списками

По умолчанию django.conf.global_settings включены как списки, так и кортежи. Все настройки, которые раньше были кортежами, теперь являются списками.

Атрибут is_usable загрузчиков шаблонов был удален

Загрузчики шаблонов Django ранее требовали наличия атрибута is_usable . Если загрузчик был настроен в настройках шаблона и этот атрибут был действительным False , загрузчик игнорировался. На практике это использовалось только загрузчиком «яйца», чтобы определить, были ли установлены инструменты установки. Этот атрибут is_usable теперь удален, и загрузчик "яиц" не работает во время выполнения, если не установлены инструменты установки.

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

При использовании загрузчиков шаблонов filesystem.Loader или app_directories.Loader предыдущие версии Django генерировали ошибку, TemplateDoesNotExist если источник шаблона существовал, но был нечитаемым. Это могло произойти при различных обстоятельствах, например, если у Django не было разрешений на открытие файла или если источником шаблона был каталог. С этого момента Django скрывает исключение только в том случае, если источник шаблона не существует. Во всех остальных случаях IOError будет сгенерировано исходное исключение .

Перенаправления HTTP больше не обязательно должны быть абсолютными URI

Относительные перенаправления больше не преобразуются в абсолютные URI. RFC 2616 требует, чтобы заголовокLocation ответов перенаправления был абсолютным URI, но этот стандарт был замененRFC 7231, который разрешает относительные URILocation , таким образом признавая реальную практику пользовательских агентов, почти все из которых принимают такой способ действий.

Следовательно, ожидаемые URL-адреса, передаваемые на, assertRedirects как правило, больше не должны включать в себя часть URL-адресов схемы и домена. Например, следует заменить на (если перенаправление специально не содержит абсолютный URL).self.assertRedirects(response, 'http://testserver/some-url/') self.assertRedirects(response, '/some-url/')

В редком случае, когда вам нужно старое поведение (обнаруженное в старой версии Apache, где mod_scgi относительное перенаправление интерпретируется как «внутреннее перенаправление»), вы можете восстановить его, написав специальное промежуточное ПО:

class LocationHeaderFix(object):
    def process_response(self, request, response):
        if 'Location' in response:
            response['Location'] = request.build_absolute_uri(response['Location'])
        return response

Прекращение поддержки PostgreSQL 9.0

Поддержка PostgreSQL 9.0 в апстрим-проектах закончилась в сентябре 2015 года. В результате Django 1.9 определила версию 1.9 как минимальную официально поддерживаемую версию PostgreSQL.

Прекращение поддержки Oracle 11.1

Поддержка Oracle 11.1 вышестоящим проектом закончилась в августе 2015 года. Таким образом, Django 1.9 определил версию 11.2 как минимальную официально поддерживаемую версию Oracle.

Удаление LoaderOrigin и StringOrigin шаблоны

В предыдущих версиях Django при инициализации механизма шаблонов debug=True экземпляр django.template.loader.LoaderOrigin или django.template.base.StringOrigin устанавливался в качестве исходного атрибута объекта шаблона. Эти классы были объединены, Origin и теперь атрибут устанавливается всегда, независимо от настройки отладки движка. Для минимального уровня обратной совместимости старые имена классов будут сохраняться как псевдонимы нового класса Origin до Django 2.0.

Изменения в конфигурации ведения журнала по умолчанию

Чтобы упростить написание пользовательских конфигураций ведения журнала, стандартная конфигурация ведения журнала Django больше не определяет django.request и django.security регистраторы. Вместо этого он определяет один django регистратор, отфильтрованный на INFO уровне, с двумя обработчиками:

  • console : фильтруется на INFO уровне и активен, только если DEBUG=True .
  • mail_admins : фильтруется на ERROR уровне и активен, только если DEBUG=False .

Если вы не переопределите ведение журнала Django по умолчанию, вы должны увидеть только минимальные изменения в поведении, но, например, вы можете увидеть некоторые новые сообщения в консоли runserver .

Если вы переопределите ведение журнала Django по умолчанию, вам следует проверить, как ваша конфигурация объединяется с новыми значениями по умолчанию.

Подробности HttpRequest в отчетах об ошибках

Избыточно отображать полную информацию о запросе HttpRequest всякий раз, когда он появлялся в виде переменной стека вызовов в HTML-версии страницы отладки и сообщения об ошибке. Таким образом, HTTP-запрос теперь отображается в том же стандартном представлении, что и другие переменные ( repr(request) ). В результате были удалены ExceptionReporterFilter.get_request_repr() недокументированные метод и функция django.http.build_request_repr() .

Содержимое текстовой версии электронного письма было изменено, чтобы обеспечить трассировку вызовов той же структуры, что и в случае запросов AJAX. Подробности трассировки вызовов производятся методом ExceptionReporter.get_traceback_text() .

Удалены адаптеры и конвертеры глобального часового пояса для объектов даты и времени

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

  • Настройка USE_TZ содержит True .
  • База данных - это SQLite, MySQL, Oracle или другая сторонняя база данных, которая не поддерживает часовые пояса. Если сомневаетесь, вы можете проверить значение connection.features.supports_timezones .
  • Код запрашивает базу данных вне ORM, обычно с помощью .cursor.execute(sql, params)

Если вы передаете datetime в такие запросы параметры часового пояса, вы должны превратить их в наивные даты / время в UTC:

from django.utils import timezone
param = timezone.make_naive(param, timezone.utc)

Если вы этого не сделаете, преобразование будет выполнено как в предыдущих версиях (с предупреждением об устаревании) до Django 1.11. Django 2.0 больше не будет выполнять преобразование, что может привести к повреждению данных.

Если вы прочитаете значения datetime в результатах, они будут наивными, а не осознанными. Вы можете компенсировать это так:

from django.utils import timezone
value = timezone.make_aware(value, timezone.utc)

В этом нет необходимости, если вы запрашиваете базу данных через ORM, даже если вы используете запросы raw() . ORM отвечает за управление информацией о часовом поясе.

Модули тегов шаблонов импортируются при настройке шаблонов

Теперь движок DjangoTemplates переходит к обнаружению шаблонных модулей маяков, установленных во время его создания. Это изменение позволяет библиотеки быть активированы явно с помощью ключа 'libraries' из OPTIONS в определении двигателя DjangoTemplates . Возможные ошибки импорта или синтаксиса в модулях тегов шаблона приводят к быстрому сбою во время создания экземпляра, а не при первой компиляции шаблона с тегом .{% load %}

Удаление django.template.base.add_to_builtins()

Несмотря на то, что это был частный API, проекты часто использовали его, add_to_builtins() чтобы сделать теги шаблонов и фильтры доступными без необходимости использовать тег . Этот API формализован. Теперь проекты должны включать в себя библиотеку , используя ключ к при определении двигателя .{% load %} 'builtins' OPTIONS DjangoTemplates

Результат simple_tag теперь всегда проходит через conditional_escape

Как правило, теги шаблона не экранируют свое содержимое автоматически, и это поведение задокументировано . Для таких тегов inclusion_tag это не проблема, потому что включенный шаблон будет выполнять автоматическое экранирование. Для assignment_tag() вывода будет экранирован, когда он используется в качестве переменной в шаблоне.

Однако для предполагаемых случаев использования simple_tag очень легко получить неверный HTML-код и, следовательно, создать риск XSS-уязвимости. Например :

@register.simple_tag(takes_context=True)
def greeting(context):
    return "Hello {0}!".format(context['request'].user.first_name)

В предыдущих версиях Django это считалось XSS-уязвимостью, потому что от нее user.first_name не удалось избежать.

В Django 1.9 это исправлено: если контекст шаблона имеет autoescape=True (по умолчанию), simple_tag результат функции тега будет передаваться как conditional_escape() .

simple_tag Вот несколько рекомендаций, которые помогут исправить теги :

  • Любой код, создающий HTML, должен использовать либо систему шаблонов, либо format_html() .
  • Если результат тега simple_tag необходимо экранировать, используйте escape() или conditional_escape() .
  • Если вы абсолютно уверены, что создаете HTML-код из надежного источника (например, поля CMS, в котором хранится HTML-код, введенный администраторами), вы можете отметить его как таковой, используя mark_safe() .

Теги, соответствующие этим правилам, будут правильными и безопасными независимо от того, работают ли они с Django 1.9+ или более ранними версиями.

Paginator.page_range

Paginator.page_range теперь итератор вместо списка.

В версиях Django до 1.8 Paginator.page_range возвращал объект list в Python 2 и объект range в Python 3. Django 1.8 по-прежнему возвращает список, но итератор более эффективен.

Существующий код, который зависит от конкретных функций объектов list , таких как индексация, может позаботиться о преобразовании итератора в list функцию list() .

Неявное выполнение запроса __in о QuerySet удален

В предыдущих версиях такие запросы, как:

Model.objects.filter(related_id=RelatedModel.objects.all())

были неявно преобразованы в:

Model.objects.filter(related_id__in=RelatedModel.objects.all())

который создал код SQL для стиля ."related_id IN (SELECT id FROM ...)"

__in Неявная операция больше не выполняется, поэтому SQL «IN» теперь равен «=», и если подзапрос возвращает несколько результатов, большинство баз данных выдаст ошибку.

Браузеры, поддерживаемые contrib.admin

Сайт администрирования больше не поддерживает версии Internet Explorer 8 и старше, так как срок службы этих браузеров официально закончился.

Изображения и стили CSS, поддерживающие Internet Explorer 6 и 7, были удалены. Значки PNG и GIF были заменены значками SVG, которые не поддерживаются Internet Explorer 8 или более ранними версиями.

Библиотека jQuery, встроенная в админку, была обновлена ​​с версии 1.11.2 до 2.1.4. jQuery 2.x имеет тот же API, что и jQuery 1.x, но не поддерживает Internet Explorer 6, 7 или 8, что обеспечивает более высокую производительность и меньший размер файла. Если вам нужна поддержка IE8 и вы также должны использовать последнюю версию Django, вы можете заменить административную копию jQuery своей собственной, создав приложение Django с такой структурой:

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

SyntaxError при установке Django setuptools 5.5.x

При установке Django 1.9 или 1.9.1 с помощью setuptools 5.5.x вы увидите:

Compiling django/conf/app_template/apps.py ...
  File "django/conf/app_template/apps.py", line 4
    class {{ camel_case_app_name }}Config(AppConfig):
          ^
SyntaxError: invalid syntax

Compiling django/conf/app_template/models.py ...
  File "django/conf/app_template/models.py", line 1
    {{ unicode_literals }}from django.db import models
                             ^
SyntaxError: invalid syntax

Эти ошибки можно игнорировать (Django все равно установится нормально), но вы можете избежать их, обновив setuptools до более новой версии. Если вы используете pip, вы можете обновить pip, используя который также обновит инструменты установки. Это решено в более поздних версиях Django, как описано в примечаниях к выпуску Django 1.9.2 .python -m pip install -U pip

Разное

  • Статические файлы jQuery contrib.admin перемещены в vendor/jquery подкаталог.
  • Текст, отображаемый для пустых столбцов в list_display ячейках административного списка изменений, изменился с (None) (или его переведенного эквивалента) на - (тире).
  • django.http.responses.REASON_PHRASES и django.core.handlers.wsgi.STATUS_CODE_TEXT были удалены. Вместо этого используйте Python stdlib: http.client.responses для Python 3 и httplib.responses для Python 2.
  • ValuesQuerySet и ValuesListQuerySet были удалены.
  • admin/base.html Шаблон больше не устанавливает window.__admin_media_prefix__ или window.__admin_utc_offset__ . Ссылки на изображения в JavaScript, которые использовали это значение для создания абсолютных URL-адресов, были перемещены в CSS для упрощения настройки. Смещение UTC хранится в атрибуте данных <body> тега.
  • CommaSeparatedIntegerField Валидация-была усовершенствована , чтобы запретить выгоды , как ',' , ',1' и '1,,2' .
  • Инициализация формы перенесена из ProcessFormView.get() метода в новый FormMixin.get_context_data() метод. Это может быть обратно несовместимым, если вы переопределили get_context_data() метод без вызова super() .
  • Поддержка PostGIS 1.5 прекращена.
  • Поле django.contrib.sites.models.Site.domain было определено как unique .
  • Чтобы обеспечить изоляцию тестов, запросы к базе данных больше не разрешены по умолчанию в SimpleTestCase тестах. Вы можете отключить это поведение, установив allow_database_queries атрибут class в True свой тестовый класс.
  • ResolverMatch.app_name был изменен, чтобы содержать полный путь пространства имен в случае вложенных пространств имен. Для согласованности с ResolverMatch.namespace пустым значением теперь является пустая строка вместо None .
  • Для усиления безопасности ключи сеанса должны содержать не менее 8 символов.
  • Приватная функция django.utils.functional.total_ordering() удалена. Он содержал обходной путь для functools.total_ordering() ошибки в версиях Python старше 2.7.3.
  • Сериализация XML (через dumpdata или через структуру синдикации), используемая для вывода любых полученных символов. Теперь, если сериализуемый контент содержит какие-либо управляющие символы, недопустимые в стандарте XML 1.0, сериализация завершится ошибкой с расширением ValueError .
  • CharField теперь по умолчанию удаляет ввод начальных и конечных пробелов. Это можно отключить, установив для нового strip аргумента значение False .
  • Текст шаблона, который переведен и использует два или более последовательных знака процента, например "%%" , может иметь новый msgid после makemessages выполнения (скорее всего, перевод будет помечен как нечеткий). Новый msgid будет отмечен ."#, python-format"
  • Если ни request.current_app ни Context.current_app не заданы, url тег шаблона теперь будет использовать пространство имен текущего запроса. Установите request.current_app значение, None если вы не хотите использовать подсказку пространства имен.
  • SILENCED_SYSTEM_CHECKS Установка в настоящее время заглушает сообщения всех уровней. Раньше ERROR на консоль выводились сообщения уровня или выше.
  • FlatPage.enable_comments Поле удаляется из , FlatPageAdmin как он не используется приложением. Если ваш проект или стороннее приложение использует его, создайте собственный ModelAdmin, чтобы добавить его обратно.
  • Возвращаемое значение setup_databases() и первый аргумент teardown_databases() изменены. Раньше они были кортежами. Теперь они просто первый элемент .(old_names, mirrors) old_names
  • По умолчанию LiveServerTestCase пытается найти доступный порт в диапазоне 8081-8179 вместо того, чтобы просто пробовать порт 8081.
  • Система проверяет ModelAdmin теперь экземпляры, а не классы.
  • Частный API для применения смешанных планов миграции был удален из соображений производительности. Смешанные планы состоят из списка миграций, в которых одни применяются, а другие не применяются.
  • Связанные классы дескрипторов объекта модели в django.db.models.fields.related (частный API) перемещаются из related модуля в related_descriptors и переименовываются следующим образом:
    • ReverseSingleRelatedObjectDescriptor является ForwardManyToOneDescriptor
    • SingleRelatedObjectDescriptor является ReverseOneToOneDescriptor
    • ForeignRelatedObjectsDescriptor является ReverseManyToOneDescriptor
    • ManyRelatedObjectsDescriptor является ManyToManyDescriptor
  • Если вы реализуете настраиваемое handler404 представление, оно должно возвращать ответ с кодом состояния HTTP 404. Используйте HttpResponseNotFound или переходите status=404 на HttpResponse . В противном случае APPEND_SLASH с DEBUG=False .

Функции, устаревшие в Django 1.9

assignment_tag()

В Django 1.4 добавлен assignment_tag помощник, упрощающий создание тегов шаблона, в которых результаты хранятся в переменной шаблона. simple_tag() Помощник приобрел такую же способность, что делает assignment_tag устаревшими. Теги, которые используют, assignment_tag должны быть обновлены для использования simple_tag .

{% cycle %} синтаксис с аргументами, разделенными запятыми

cycle Тег поддерживает подчиненный старый синтаксис из предыдущих версий Django:

{% cycle row1,row2,row3 %}

Его синтаксический анализ вызвал ошибки с текущим синтаксисом, поэтому поддержка старого синтаксиса будет удалена в Django 1.10 после ускоренного прекращения поддержки.

ForeignKey и OneToOneField on_delete аргумент

Чтобы повысить осведомленность о каскадном удалении модели, в Django 2.0 потребуется on_delete аргумент ForeignKey и OneToOneField .

Обновите модели и существующие миграции, чтобы явно указать аргумент. Поскольку значение по умолчанию - models.CASCADE добавить on_delete=models.CASCADE ко всем ForeignKey и OneToOneField s, которые не используют другой параметр. Вы также можете передать его в качестве второго позиционного аргумента, если вас не волнует совместимость со старыми версиями Django.

Field.rel изменения

Field.rel и его методы и атрибуты были изменены, чтобы соответствовать API связанных полей. Field.rel Атрибут переименован remote_field и многие из его методов и атрибутов, либо изменить или переименовать.

Цель этих изменений - предоставить задокументированный API для полей отношений.

GeoManager и GeoQuerySet пользовательские методы

Все пользовательские GeoQuerySet методы ( area() , distance() , gml() ...) - были-были заменены географическими эквивалентными выражениями в аннотации (см новых функций). Следовательно, необходимость настраивать пользовательские GeoManager модели для ГИС-моделей теперь устарела. Как только ваш код не вызывает ни одного из устаревших методов, вы можете просто удалить строки из своих моделей.objects = GeoManager()

Изменились API загрузчика шаблонов

Загрузчики шаблонов Django были обновлены, чтобы разрешить рекурсивное расширение шаблона. Это изменение потребовало нового API загрузчика шаблонов. Старые load_template() и load_template_sources() методы в настоящее время не рекомендуется. Подробности о новом API можно найти в документации загрузчика шаблонов .

Передача 3-кортеж или app_name к include()

Часть пространства имен экземпляра при передаче кортежа в качестве аргумента include() была заменена передачей namespace аргумента в include() . Например:

polls_patterns = [
     url(...),
]

urlpatterns = [
    url(r'^polls/', include((polls_patterns, 'polls', 'author-polls'))),
]

СТАНОВИТСЯ:

polls_patterns = ([
     url(...),
], 'polls')  # 'polls' is the app_name

urlpatterns = [
    url(r'^polls/', include(polls_patterns, namespace='author-polls')),
]

app_name Аргумент include() был заменен путем пропускания 2-кортеж (как указано выше), или передавая объект или модуль с app_name атрибутом (как показано ниже). Если app_name задано этим новым способом, namespace аргумент больше не требуется. По умолчанию будет установлено значение app_name . Например, шаблоны URL-адресов в руководстве изменены с:

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 на request вместо того , чтобы передать его в отдельный аргумент.

django.contrib.gis.geoip

В django.contrib.gis.geoip2 модуле аннулирует django.contrib.gis.geoip . Новый модуль предоставляет аналогичный API, за исключением того, что он не предоставляет устаревшие методы совместимости API GeoIP-Python.

Разное

  • weak Аргумент django.dispatch.signals.Signal.disconnect() является устаревшим , поскольку это не имеет никакого эффекта.
  • Этот check_aggregate_support() метод django.db.backends.base.BaseDatabaseOperations устарел и будет удален в Django 2.0. check_expression_support() Вместо этого следует использовать более общие .
  • django.forms.extras устарела. Вы можете найти SelectDateWidget в django.forms.widgets (или просто django.forms ) вместо этого.
  • Частный API django.db.models.fields.add_lazy_relation() устарел.
  • django.contrib.auth.tests.utils.skipIfCustomUser() Декоратор устарела. С изменениями обнаружения тестов в Django 1.6 тесты django.contrib приложений больше не выполняются как часть проекта пользователя. Таким образом, @skipIfCustomUser декоратор больше не нужен для оформления тестов в django.contrib.auth .
  • Если вы настроили некоторые обработчики ошибок , сигнатуры представления только с одним параметром запроса устарели. Представления теперь также должны принимать второй exception позиционный параметр.
  • django.utils.feedgenerator.Atom1Feed.mime_type И django.utils.feedgenerator.RssFeed.mime_type атрибуты являются устаревшими в пользу content_type .
  • Signer теперь выдает предупреждение, если используется недопустимый разделитель. Это станет исключением в Django 1.10.
  • django.db.models.Field._get_val_from_obj() устарел в пользу Field.value_from_object() .
  • django.template.loaders.eggs.Loader устарел как распространяющие приложения, так как яйца не рекомендуется.
  • callable_obj Ключевое слово аргумент SimpleTestCase.assertRaisesMessage() является устаревшим. Вместо этого передайте вызываемый объект как позиционный аргумент.
  • allow_tags Атрибут методов ModelAdmin является устаревшим. Используйте format_html() , format_html_join() или mark_safe() При создании возвращаемого значения метода INSTEAD.
  • enclosure Ключевое слово аргумент SyndicationFeed.add_item() является устаревшим. Используйте новый enclosures аргумент, который принимает список Enclosure объектов вместо одного.
  • django.template.loader.LoaderOrigin И django.template.base.StringOrigin псевдонимы для django.template.base.Origin осуждаются.

Функции удалены в 1.9

Эти функции достигли конца цикла устаревания и удалены в Django 1.9. См. « Устаревшие функции в 1.7» для получения подробной информации, в том числе о том, как отказаться от использования этих функций.

  • django.utils.dictconfig устранен.
  • django.utils.importlib устранен.
  • django.utils.tzinfo устранен.
  • django.utils.unittest устранен.
  • Команда syncdb удалена.
  • django.db.models.signals.pre_syncdb и django.db.models.signals.post_syncdb удаляется.
  • Поддержка allow_syncdb маршрутизаторов на базе данных удалена.
  • Убрана автоматическая синхронизация приложений без миграций. Миграция является обязательной для всех приложений, если вы не передадите эту опцию.migrate --run-syncdb
  • Команды SQL для приложений управления без миграции, sql , sqlall , sqlclear , sqldropindexes , и sqlindexes , удаляются.
  • Удалена поддержка автоматической загрузки initial_data фикстур и исходных данных SQL.
  • Все модели должны быть определены внутри установленного приложения или объявлены явным app_label . Более того, их невозможно импортировать до загрузки приложения. В частности, невозможно импортировать модели внутри корневого пакета приложения.
  • Модель и форма IPAddressField удалены. Поле-заглушка остается для совместимости с историческими миграциями.
  • AppCommand.handle_app() больше не поддерживается.
  • RequestSite и get_current_site() больше не импортируются из django.contrib.sites.models .
  • Поддержка FastCGI через команду runfcgi управления удалена.
  • django.utils.datastructures.SortedDict устранен.
  • ModelAdmin.declared_fieldsets устранен.
  • Удаляются util модули, обеспечивающие обратную совместимость:
    • django.contrib.admin.util
    • django.contrib.gis.db.backends.util
    • django.db.backends.util
    • django.forms.util
  • ModelAdmin.get_formsets устранен.
  • Прокладки с обратной совместимостью, введенные для переименования BaseMemcachedCache._get_memcache_timeout() метода, get_backend_timeout() удалены.
  • --natural И -n опции для dumpdata удаляются.
  • use_natural_keys Аргумент serializers.serialize() удаляется.
  • Частный API django.forms.forms.get_declared_fields() удален.
  • Возможность использовать SplitDateTimeWidget with 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 удален.

Copyright ©2020 All rights reserved