Примечания к выпуску 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 шаблона по умолчанию , включен простой набор валидаторов. Чтобы включить базовую проверку во включенных формах авторизации для вашего проекта, вы можете установить, например:

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 теперь поставляется с Mixins 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 класса A. В старых версиях браузера могут наблюдаться различные уровни постепенной деградации.

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

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

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

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

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

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

django.contrib.admin

  • Представления администратора теперь имеют атрибуты model_adminили admin_site.
  • URL-адрес представления изменений администратора был изменен ( /admin/<app>/<model>/<pk>/по умолчанию был по адресу , а теперь находится по адресу /admin/<app>/<model>/<pk>/change/). Это не должно повлиять на ваше приложение, если у вас нет жестко заданных URL-адресов администратора. В этом случае замените эти ссылки, изменив адреса администратора . Обратите внимание, что старый URL-адрес по-прежнему перенаправляется на новый для обратной совместимости, но он может быть удален в будущей версии.
  • ModelAdmin.get_list_select_related()был добавлен, чтобы разрешить изменение select_related()значений, используемых в запросе списка изменений администратора на основе запроса.
  • В метод available_appsбыла добавлена ​​контекстная переменная, в которой перечислены доступные приложения для текущего пользователя AdminSite.each_context().
  • AdminSite.empty_value_displayи ModelAdmin.empty_value_displayбыли добавлены, чтобы переопределить отображение пустых значений в списке изменений администратора. Вы также можете настроить значение для каждого поля.
  • Добавлены события jQuery при добавлении или удалении встроенной формы на странице формы изменения.
  • Виджет выбора времени включает опцию «6 часов вечера» для единообразия наличия предопределенных опций каждые 6 часов.
  • Генерация ярлыков JavaScript теперь поддерживает румынские символы.

django.contrib.admindocs

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

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 в памяти из необработанных данных. Добавлены сеттеры для свойств растра, таких как проекция или значения пикселей.
  • Для пользователей 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()возвращается domain:port, например example.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-revalidateCache-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аргумент, разрешающий использование символов Юникода в ярлыках.
  • CharFieldтеперь принимает stripаргумент для удаления начальных и конечных пробелов из входных данных. По умолчанию Trueэто поведение отличается от предыдущих выпусков.
  • Поля формы теперь поддерживают disabledаргумент, что позволяет отображать виджет поля отключенным браузерами.
  • Теперь можно настроить связанные поля, переопределив get_bound_field()метод поля .

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

  • Представления на основе классов, созданные с использованием атрибутов as_view()now have 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 ), вы должны указать путь к конфигурации приложения, например 'polls.apps.PollsConfig', INSTALLED_APPSдля его использования (а не просто 'polls').
  • При использовании серверной части PostgreSQL dbshellкоманда может подключаться к базе данных, используя пароль из вашего файла настроек (вместо того, чтобы требовать его ввода вручную).
  • djangoПакет может быть запущен в качестве сценария, то есть , который будет вести себя так же , как .python -m djangodjango-admin
  • Команды управления, которые --noinputтеперь имеют эту опцию, также принимают --no-inputв качестве псевдонима для этой опции.

Миграции

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

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

  • При указании Noneзначения в MIGRATION_MODULESDjango будет рассматривать приложение как приложение без миграций.

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

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

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

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

Модели

  • QuerySet.bulk_create() теперь работает на прокси-моделях.
  • Конфигурация базы данных получила TIME_ZONE возможность взаимодействия с базами данных, которые хранят дату и время по местному времени и не поддерживают часовые пояса, когда USE_TZесть True.
  • Добавлен RelatedManager.set()метод соответствующих менеджеров , созданных ForeignKey, GenericForeignKeyи ManyToManyField.
  • add()Способ по обратному внешнему ключу теперь имеет bulkпараметр , чтобы разрешить выполнение одного запроса , независимо от количества объектов добавляются , а не одного запроса на объект.
  • Добавлен keep_parentsпараметр, Model.delete()позволяющий удалять только дочерние данные в модели, использующей многотабличное наследование.
  • Model.delete() и QuerySet.delete()вернуть количество удаленных объектов.
  • Добавлена ​​проверка системы, чтобы предотвратить определение обоих Meta.orderingи order_with_respect_toдля одной и той же модели.
  • Date and timeпоиски могут быть соединены с другими выборками (например 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()для получения исходного порта запроса.
  • Добавлен json_dumps_paramsпараметр, JsonResponseпозволяющий передавать аргументы ключевого слова json.dumps()вызову, используемому для генерации ответа.
  • BrokenLinkEmailsMiddlewareТеперь игнорирует ошибки 404 , когда реферер равно запрошенный URL. Чтобы обойти уже реализованную проверку пустого реферера, некоторые веб-боты устанавливают реферер на запрошенный URL.

Шаблоны

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

Тесты

  • Добавлен 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 in 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 = TrueDatabaseCreation.get_test_db_clone_settings()

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

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

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

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

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

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

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

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

Следовательно, ожидаемые URL-адреса, передаваемые на, assertRedirectsкак правило, больше не должны включать в себя часть URL-адресов схемы и домена. Например, следует заменить на (если перенаправление специально не содержит абсолютный 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 устанавливает 9.1 как минимальную официально поддерживаемую версию PostgreSQL.

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

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

Шаблон LoaderOriginи StringOriginудаляются

В предыдущих версиях Django, когда механизм шаблонов был инициализирован с помощью debug as 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()для предоставления тегов и фильтров шаблонов без использования тега. Этот API формализован. Теперь проекты должны определять встроенные библиотеки с помощью ключа при определении серверной части.{% load %}'builtins'OPTIONSDjangoTemplates

simple_tagтеперь переносит вывод тегов в conditional_escape

Как правило, теги шаблона не экранируют свое содержимое автоматически, и это поведение задокументировано . Для таких тегов inclusion_tagэто не проблема, потому что включенный шаблон будет выполнять автоматическое экранирование. For 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возвращал a listв Python 2 и a rangeв Python 3. Django 1.8 последовательно возвращал список, но итератор более эффективен.

Существующий код, зависящий от listопределенных функций, таких как индексация, можно перенести путем преобразования итератора в listusing 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больше не происходит, поэтому «IN» SQL теперь имеет «=», и если подзапрос возвращает несколько результатов, по крайней мере некоторые базы данных выдадут ошибку.

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.

Функции, устаревшие в версии 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и 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 можно найти в документации загрузчика шаблонов .

Передача 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, за исключением того, что он не предоставляет устаревшие методы совместимости GeoIP-Python API.

Разное

  • 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()при построении возвращаемого значения метода.
  • 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()удален.
  • Возможность использовать SplitDateTimeWidgetwith 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 ©2021 All rights reserved