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

1 апреля 2015

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

Эти заметки о выпуске охватывают new features, а также некоторые backwards incompatible changes, о которых вы захотите знать при переходе с Django 1.7 или более старых версий. Мы также begun the deprecation process for some features, а некоторые функции достигли конца своего процесса устаревания и have been removed.

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

Django 1.8 был назначен вторым long-term support release. Она будет получать обновления безопасности в течение как минимум трех лет после выпуска. Поддержка предыдущей LTS, Django 1.4, закончится через 6 месяцев после выхода Django 1.8.

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

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

Django 1.8 - это первый релиз, поддерживающий Python 3.5.

В связи с прекращением поддержки Python 3.2 в феврале 2016 года, мы не будем тестировать Django 1.8.x на Python 3.2 после конца 2016 года.

Что нового в Django 1.8

Model._meta API

Django теперь имеет формализованный API для Model._meta, предоставляя официально поддерживаемый способ retrieve fields и фильтрации полей на основе их attributes.

Объект Model._meta был частью Django со времен до версии 0.96 «Magic Removal» - он просто не был официальным, стабильным API. Признавая это, мы постарались сохранить обратную совместимость со старой конечной точкой API, где это возможно. Однако конечные точки API, которые не являются частью нового официального API, были устаревшими и со временем будут удалены.

Несколько шаблонизаторов

Django 1.8 определяет стабильный API для интеграции бэкендов шаблонов. Он включает встроенную поддержку языка шаблонов Django и Jinja2. Он поддерживает рендеринг шаблонов с несколькими движками в рамках одного проекта. Узнайте больше о новых возможностях в topic guide и ознакомьтесь с инструкциями по обновлению в старых версиях документации.

Усовершенствования в области безопасности

Некоторые возможности сторонней библиотеки django-secure были интегрированы в Django. django.middleware.security.SecurityMiddleware обеспечивает несколько улучшений безопасности цикла запрос/ответ. Новая опция check --deploy позволяет вам проверить файл настроек вашего продакшена на предмет способов повышения безопасности вашего сайта.

Новая функциональность, специфичная для PostgreSQL

В Django появился модуль с расширениями для специфических возможностей PostgreSQL, таких как ArrayField, HStoreField, Поля диапазона и unaccent lookup. Полное описание возможностей доступно in the documentation.

Новые типы данных

  • В Django теперь есть UUIDField для хранения универсально уникальных идентификаторов. Он хранится как собственный тип данных uuid в PostgreSQL и как символьное поле фиксированной длины в других бэкендах. Существует соответствующий form field.
  • В Django теперь есть DurationField для хранения периодов времени - в Python это моделируется timedelta. Он хранится в собственном типе данных <<<2 >>> в PostgreSQL, как <<<3 >>> в Oracle, и как <<<4 >>> микросекунд в других бэкендах. Арифметика, связанная с датой и временем, также была улучшена на всех бэкендах. Имеется соответствующее значение interval.

Выражения запросов, условные выражения и функции базы данных

Query Expressions позволяют создавать, настраивать и составлять сложные SQL-выражения. Это позволило annotate принимать выражения, отличные от агрегатов. Агрегаты теперь могут ссылаться на несколько полей, а также выполнять арифметические действия, аналогично объектам F(). order_by() также получил возможность принимать выражения.

Conditional Expressions позволяют использовать ifelifelse логику в запросах.

Коллекция database functions также включена с такими функциональными возможностями, как Coalesce, Concat и Substr.

TestCase установка данных

TestCase был рефакторингован, чтобы позволить инициализацию данных на уровне класса с использованием транзакций и точек сохранения. Бэкенды баз данных, не поддерживающие транзакции, такие как MySQL с механизмом хранения MyISAM, по-прежнему смогут выполнять эти тесты, но не получат преимуществ от улучшений. Тесты теперь выполняются в двух вложенных блоках atomic(): один для всего класса и один для каждого теста.

  • Метод класса TestCase.setUpTestData() добавляет возможность установки тестовых данных на уровне класса. Использование этой техники может ускорить выполнение тестов по сравнению с использованием setUp().
  • Загрузка приспособления в пределах TestCase теперь выполняется один раз для всего TestCase.

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

django.contrib.admin

  • ModelAdmin теперь имеет метод has_module_permission(), позволяющий ограничить доступ к модулю на индексной странице администратора.
  • InlineModelAdmin теперь имеет атрибут show_change_link, который поддерживает показ ссылки на форму изменения инлайн-объекта.
  • Используйте новый django.contrib.admin.RelatedOnlyFieldListFilter в ModelAdmin.list_filter, чтобы ограничить выбор list_filter посторонними объектами, которые прикреплены к объектам из ModelAdmin.
  • ModelAdmin.delete_view() отображает сводку удаляемых объектов на странице подтверждения удаления.
  • Библиотека jQuery, встроенная в админку, была обновлена до версии 1.11.2.
  • Теперь вы можете указать AdminSite.site_url, чтобы отобразить ссылку на внешний сайт.
  • Теперь вы можете указать ModelAdmin.show_full_result_count, чтобы контролировать отображение полного количества объектов на отфильтрованной странице администратора.
  • Метод AdminSite.password_change() теперь имеет параметр extra_context.
  • Теперь вы можете контролировать, кто может войти на сайт администратора, переопределив только AdminSite.has_permission() и AdminSite.login_form. Шаблон base.html имеет новый блок usertools, который содержит специфический для пользователя заголовок. Новая контекстная переменная has_permission, которая получает свое значение из has_permission(), указывает, может ли пользователь получить доступ к сайту.
  • В выпадающих списках внешних ключей теперь есть кнопки для изменения или удаления связанных объектов с помощью всплывающего окна.

django.contrib.admindocs

  • reStructuredText теперь разбирается в документах модели.

django.contrib.auth

  • Бэкенды авторизации теперь могут поднимать PermissionDenied в has_perm() и has_module_perms() для обхода проверки разрешений.
  • PasswordResetForm теперь имеет метод send_mail(), который может быть переопределен для настройки отправляемой почты.
  • Размер max_length из Permission.name был увеличен с 50 до 255 символов. Пожалуйста, запустите миграцию базы данных.
  • USERNAME_FIELD и REQUIRED_FIELDS теперь поддерживают ForeignKeys.
  • Количество итераций по умолчанию для хешера паролей PBKDF2 было увеличено на 33%. Это обратно совместимое изменение не повлияет на пользователей, которые подклассифицировали django.contrib.auth.hashers.PBKDF2PasswordHasher для изменения значения по умолчанию.

django.contrib.gis

  • Теперь доступен новый GeoJSON serializer.
  • Теперь разрешено включать подзапрос в качестве аргумента географического поиска, например City.objects.filter(point__within=Country.objects.filter(continent='Africa').values('mpoly')).
  • Бэкэнд SpatiaLite теперь поддерживает агрегаты Collect и Extent, если версия базы данных 3.0 или более поздняя.
  • Команды инициализации PostGIS 2 CREATE EXTENSION postgis и SpatiaLite SELECT InitSpatialMetaData теперь автоматически выполняются migrate.
  • Интерфейс GDAL теперь поддерживает получение свойств raster (image) data file.
  • Шимсы совместимости для SpatialRefSys и GeometryColumns, измененные в Django 1.2, были удалены.
  • Все исключения, связанные с GDAL, теперь вызываются с помощью GDALException. Прежнее OGRException было сохранено для обратной совместимости, но больше не должно использоваться.

django.contrib.sessions

  • Куки сессии теперь удаляются после вызова flush().

django.contrib.sitemaps

  • Новый атрибут Sitemap.i18n позволяет генерировать карту сайта на основе настройки LANGUAGES.

django.contrib.sites

  • get_current_site() теперь будет искать текущий сайт на основе request.get_host(), если параметр SITE_ID не определен.
  • Умолчание Site, создаваемое при выполнении migrate, теперь учитывает установку SITE_ID (вместо того, чтобы всегда использовать pk=1).

Кэш

  • Метод incr() бэкенда django.core.cache.backends.locmem.LocMemCache теперь потокобезопасен.

Криптография

Бэкенды баз данных

  • Бэкенд MySQL больше не вычеркивает микросекунды из значений datetime, поскольку MySQL 5.6.4 и выше поддерживает дробные секунды в зависимости от объявления поля datetime (когда DATETIME включает дробную точность больше 0). Новые столбцы базы данных datetime, созданные с Django 1.8 и MySQL 5.6.4 и выше, будут поддерживать микросекунды. Более подробную информацию смотрите в MySQL database notes.
  • Бэкэнд MySQL больше не создает явные индексы для внешних ключей при использовании механизма хранения InnoDB, поскольку MySQL уже создает их автоматически.
  • Бэкэнд Oracle больше не определяет функцию connection_persists_old_columns как True. Вместо этого Oracle теперь будет включать условие разрушения кэша при получении описания таблицы.

Электронная почта

  • Email backends теперь поддерживает протокол контекстного менеджера для открытия и закрытия соединений.
  • Бэкенд электронной почты SMTP теперь поддерживает аутентификацию keyfile и certfile с настройками EMAIL_SSL_CERTFILE и EMAIL_SSL_KEYFILE.
  • SMTP EmailBackend теперь поддерживает установку параметра timeout с настройкой EMAIL_TIMEOUT.
  • EmailMessage и EmailMultiAlternatives теперь поддерживают параметр reply_to.

Хранение файлов

  • Storage.get_available_name() и Storage.save() теперь принимают аргумент max_length для реализации ограничений максимальной длины имени файла на уровне хранилища. Имена файлов, превышающие этот аргумент, будут усекаться. Это предотвращает ошибку базы данных при добавлении уникального суффикса к длинному имени файла, который уже существует в хранилище. См. раздел deprecation note о добавлении этого аргумента в пользовательские классы хранилищ.

Формы

  • Виджеты форм теперь отображают атрибуты со значением True или False как булевые атрибуты HTML5.
  • Новый метод has_error() позволяет проверить, произошла ли конкретная ошибка.
  • Если на форме определено required_css_class, то теги <label> для обязательных полей будут иметь этот класс в своих атрибутах.
  • Вывод ошибок, не относящихся к полю, в неупорядоченных списках (<ul>) теперь включает nonfield в список классов, чтобы отличать их от ошибок, относящихся к полю.
  • Field теперь принимает аргумент label_suffix, который отменяет label_suffix формы. Это позволяет настраивать суффикс для каждого поля - ранее было невозможно переопределить суффикс формы label_suffix при использовании в шаблонах таких ярлыков, как {{ form.as_p }}.
  • SelectDateWidget теперь принимает аргумент empty_label, который будет переопределять метку выбора верхнего списка, когда DateField не требуется.
  • После очистки и проверки файла ImageField объект UploadedFile будет иметь дополнительный атрибут image, содержащий экземпляр Pillow Image, используемый для проверки того, является ли файл действительным изображением. Он также обновит UploadedFile.content_type с типом содержимого изображения, определенным Pillow.
  • Теперь при инстанцировании ChoiceField можно передать вызываемую переменную, которая возвращает итерацию вариантов.

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

  • Общие представления, использующие MultipleObjectMixin, теперь могут указывать порядок, применяемый к queryset, задавая ordering или переопределяя get_ordering().
  • Новый атрибут SingleObjectMixin.query_pk_and_slug позволяет изменить поведение get_object() таким образом, что он будет выполнять поиск, используя как первичный ключ, так и slug.
  • Метод get_form() больше не требует указания form_class. Если form_class не предоставлено, по умолчанию используется get_form_class().
  • Заголовки в ModelFormMixin.success_url теперь поддерживают синтаксис Python str.format(). Устаревший синтаксис %(<foo>)s все еще поддерживается, но будет удален в Django 1.10.

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

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

Ведение журнала

Команды управления

  • Соединения с базой данных теперь всегда закрываются после того, как команда управления, вызванная из командной строки, выполнила свою работу.
  • Команды из альтернативных форматов пакетов, таких как eggs, теперь также обнаруживаются.
  • Новая опция dumpdata --output позволяет указать файл, в который записываются сериализованные данные.
  • Новые опции makemessages --exclude и compilemessages --exclude позволяют исключить из обработки определенные локали.
  • compilemessages теперь имеет опцию --use-fuzzy или -f, которая включает нечеткие переводы в скомпилированные файлы.
  • Опция loaddata --ignorenonexistent теперь игнорирует данные для моделей, которые больше не существуют.
  • runserver теперь использует потоки демонов для более быстрой перезагрузки.
  • inspectdb теперь выводит Meta.unique_together. Он также способен интроспектировать AutoField для баз данных MySQL и PostgreSQL.
  • При вызове команд управления с опциями с помощью call_command(), имя опции может соответствовать имени опции командной строки (без начальных тире) или имени конечной переменной назначения опции, но в любом случае результирующей опцией, получаемой командой, теперь всегда является имя dest, указанное в определении опции команды (пока команда использует модуль argparse).
  • Команда dbshell теперь поддерживает дополнительную настройку центра сертификации SSL в MySQL (--ssl-ca).
  • Новый параметр makemigrations --name позволяет дать миграции (миграциям) пользовательское имя вместо сгенерированного.
  • Команда loaddata теперь предотвращает повторную загрузку приспособления. Если FIXTURE_DIRS содержит дубликаты или путь к каталогу приспособлений по умолчанию (app_name/fixtures), возникает исключение.
  • Новая опция makemigrations --exit позволяет завершить работу с кодом ошибки, если миграции не созданы.
  • Новая команда showmigrations позволяет перечислить все миграции и их зависимости в проекте.

Middleware

  • Атрибут CommonMiddleware.response_redirect_class позволяет настраивать перенаправления, выдаваемые промежуточным ПО.
  • Отладочное сообщение будет заноситься в журнал django.request, когда промежуточное ПО вызывает исключение MiddlewareNotUsed в режиме DEBUG.

Миграции

  • Операция RunSQL теперь может обрабатывать параметры, передаваемые в операторы SQL.
  • Теперь возможно иметь миграции (скорее всего data migrations) для приложений без моделей.
  • Миграции теперь могут serialize model managers как часть состояния модели.
  • Было добавлено generic mechanism to handle the deprecation of model fields.
  • Метод/атрибут класса RunPython.noop() и RunSQL.noop были добавлены для облегчения выполнения обратимых операций RunPython и RunSQL.
  • Операции миграции RunPython и RunSQL теперь вызывают метод allow_migrate() маршрутизаторов баз данных. Маршрутизатор может использовать вновь введенные аргументы app_label и hints для принятия решения о маршрутизации. Чтобы воспользоваться этой возможностью, необходимо обновить маршрутизатор до новой сигнатуры allow_migrate, подробнее см. в deprecation section.

Модели

  • Django теперь регистрирует не более 9000 запросов в connections.queries, чтобы предотвратить чрезмерное использование памяти в длительно работающих процессах в режиме отладки.
  • Теперь существует опция модели Meta для определения default related name для всех реляционных полей модели.
  • Распаковка моделей и наборов запросов в разных версиях Django официально не поддерживается (это может работать, но нет гарантии). Дополнительная переменная, указывающая текущую версию Django, теперь добавляется к состоянию pickled моделей и querysets, и Django выдает ошибку RuntimeWarning, когда эти объекты распаковываются в версии, отличной от той, в которой они были распакованы.
  • Добавлен Model.from_db(), который Django использует всякий раз, когда объекты загружаются с помощью ORM. Метод позволяет настраивать поведение загрузки модели.
  • extra(select={...}) теперь позволяет экранировать литеральную последовательность %s с помощью %%s.
  • Custom Lookups теперь можно зарегистрировать с помощью шаблона декоратора.
  • Новый атрибут Transform.bilateral позволяет создавать двусторонние преобразования. Эти преобразования применяются как к lhs, так и к rhs при использовании в выражении поиска, предоставляя возможности для более сложного поиска.
  • Специальные символы SQL (, %, _) теперь экранируются правильно, когда поиск по шаблону (например, contains, startswith и т.д.) используется с выражением F() в качестве правой части. В этих случаях экранирование выполняется базой данных, что может привести к несколько сложным запросам, включающим вложенные вызовы функций REPLACE.
  • Теперь вы можете обновлять экземпляры модели с помощью Model.refresh_from_db().
  • Теперь вы можете получить набор отложенных полей для модели, используя Model.get_deferred_fields().
  • Поле модели default теперь используется, когда для поля первичного ключа установлено значение None.

Сигналы

  • Исключения из кортежей (receiver, exception), возвращаемых Signal.send_robust(), теперь имеют трассировку в виде атрибута __traceback__.
  • Аргумент environ, который содержит структуру окружения WSGI из запроса, был добавлен к сигналу request_started.
  • Теперь вы можете импортировать сигнал setting_changed() из django.core.signals, чтобы избежать загрузки django.test в нетестовых ситуациях. Django больше не делает этого сам.

Система проверки Framework

  • register теперь можно использовать как функцию.

Шаблоны

  • urlize теперь поддерживает ссылки только на домен, которые включают символы после домена верхнего уровня (например, djangoproject.com/ и djangoproject.com/download/).
  • urlize не рассматривает восклицательные знаки в конце домена или его строки запроса как часть URL (URL, например, 'djangoproject.com! - это djangoproject.com).
  • Добавлен класс locmem.Loader, который загружает шаблоны Django из словаря Python.
  • Тег now теперь может хранить свой вывод в контекстной переменной с обычным синтаксисом: {% now 'j n Y' as varname %}.

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

  • WSGIRequest теперь уважает пути, начинающиеся с //.
  • Метод HttpRequest.build_absolute_uri() теперь корректно обрабатывает пути, начинающиеся с //.
  • Если DEBUG равно True, а запрос вызывает SuspiciousOperation, то в ответ будет выдана подробная страница ошибки.
  • Аргумент query_string в QueryDict теперь необязателен, по умолчанию он равен None, поэтому пустой QueryDict теперь можно инстанцировать с помощью QueryDict() вместо QueryDict(None) или QueryDict('').
  • Атрибуты GET и POST объекта HttpRequest теперь являются QueryDicts, а не словарями, а атрибут FILES теперь является MultiValueDict. Это приводит данный класс в соответствие с документацией и с WSGIRequest.
  • Был добавлен атрибут HttpResponse.charset.
  • WSGIRequestHandler теперь следует RFC при преобразовании URI в IRI, используя uri_to_iri().
  • Метод HttpRequest.get_full_path() теперь правильно экранирует небезопасные символы из части пути унифицированного идентификатора ресурса (URI).
  • HttpResponse теперь реализует несколько дополнительных методов, как getvalue(), чтобы экземпляры можно было использовать как объекты потока.
  • Новый метод HttpResponse.setdefault() позволяет установить заголовок, если он еще не был установлен.
  • Вы можете использовать новый FileResponse для потоковой передачи файлов.
  • Декоратор condition() для условной обработки представления теперь поддерживает заголовок If-unmodified-since.

Тесты

  • Были реализованы методы RequestFactory.trace() и Client.trace(), позволяющие создавать TRACE запросы в ваших тестах.
  • Аргумент count был добавлен к assertTemplateUsed(). Это позволяет утверждать, что шаблон был отрисован определенное количество раз.
  • Новое утверждение assertJSONNotEqual() позволяет проверить, что два фрагмента JSON не равны.
  • Добавлены опции к команде test для сохранения базы данных тестов (--keepdb), для запуска тестовых примеров в обратном порядке (--reverse) и для включения протоколирования SQL для неудачных тестов (--debug-sql).
  • Добавлен атрибут resolver_match для тестирования ответов клиента.
  • Добавлено несколько настроек, позволяющих настраивать параметры тестового табличного пространства для Oracle: DATAFILE, DATAFILE_TMP, DATAFILE_MAXSIZE и DATAFILE_TMP_MAXSIZE.
  • Декоратор override_settings() теперь может влиять на главный маршрутизатор в DATABASE_ROUTERS.
  • Добавлена поддержка тестового клиента для загрузки файлов с файлоподобными объектами.
  • При тестировании с базой данных SQLite in-memory при использовании Python 3.4+ и SQLite 3.7.13+ теперь используется общий кэш. Это позволяет разделять базу данных между потоками.

Валидаторы

  • URLValidator теперь поддерживает адреса IPv6, домены unicode и URL, содержащие данные аутентификации.

Изменения в 1.8, несовместимые с обратными изменениями

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

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

Присвоение несохраненных объектов отношениям приводит к ошибке

Примечание

Чтобы легче было разрешить использование моделей в памяти, это изменение было отменено в Django 1.8.4 и заменено проверкой при model.save(). Например:

>>> book = Book.objects.create(name="Django")
>>> book.author = Author(name="John")
>>> book.save()
Traceback (most recent call last):
...
ValueError: save() prohibited to prevent data loss due to unsaved related object 'author'.

В Django 1.8.5 была удалена аналогичная проверка присваивания для обратных отношений один-к-одному.

Назначение несохраненных объектов на ForeignKey, GenericForeignKey и OneToOneField теперь вызывает ValueError.

Ранее назначение несохраненного объекта молча игнорировалось. Например:

>>> book = Book.objects.create(name="Django")
>>> book.author = Author(name="John")
>>> book.author.save()
>>> book.save()

>>> Book.objects.get(name="Django")
>>> book.author
>>>

Теперь для предотвращения потери данных будет выдаваться ошибка:

>>> book.author = Author(name="john")
Traceback (most recent call last):
...
ValueError: Cannot assign "<Author: John>": "Author" instance isn't saved in the database.

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

Команды управления, которые принимают только позиционные аргументы

Если вы написали пользовательскую команду управления, принимающую только позиционные аргументы, и не указали переменную класса args, вы можете получить ошибку типа Error: unrecognized arguments: ..., поскольку разбор переменных теперь основан на argparse, который неявно не принимает позиционные аргументы. Вы можете сделать свою команду обратно совместимой, просто установив переменную класса args. Однако, если вам не нужно сохранять совместимость со старыми версиями Django, лучше реализовать новый метод <add_arguments(), как описано в Написание пользовательских команд django-admin.

Пользовательские аргументы команд управления тестами через программу запуска тестов

Метод добавления пользовательских аргументов к команде управления test через бегунок тестирования изменился. Раньше для добавления дополнительных аргументов можно было использовать переменную класса option_list в тестовом бегуне (а-ля :py<<<0 >>>). Теперь для реализации того же поведения необходимо создать метод класса <<<1 >>> в тестовом бегуне и вызвать <<<2 >>> для добавления любых пользовательских аргументов, поскольку парсер теперь является экземпляром :py<<<3 >>>.

Проверка модели гарантирует, что автоматически генерируемые имена столбцов находятся в пределах, заданных базой данных

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

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

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

Проверка также применяется к столбцам, созданным в неявной модели ManyToManyField.through. Если вы столкнулись с проблемой, используйте through для создания явной модели, а затем укажите db_column для ее столбца (столбцов) по мере необходимости.

Поиск отношений запросов теперь проверяет типы объектов

Запрос на поиск модели теперь проверяет, имеет ли переданный объект правильный тип, и выдает ошибку ValueError, если нет. Ранее Django не заботился о том, что объект имеет правильный тип; он просто использовал атрибут связанного поля объекта (например, id) для поиска. Теперь для предотвращения неправильного поиска выдается ошибка:

>>> book = Book.objects.create(name="Django")
>>> book = Book.objects.filter(author=book)
Traceback (most recent call last):
...
ValueError: Cannot query "<Book: Django>": Must be "Author" instance.

По умолчанию EmailField.max_length увеличено до 254

Старый стандартный 75-символьный max_length не позволял хранить все возможные адреса электронной почты, соответствующие требованиям RFC3696/5321. Для того чтобы хранить все возможные действительные адреса электронной почты, max_length был увеличен до 254 символов. Вам необходимо создать и применить миграции базы данных для ваших затронутых моделей (или добавить max_length=75, если вы хотите сохранить длину для ваших текущих полей). Миграция для django.contrib.auth.models.User.email включена в комплект поставки.

Поддержка версий PostgreSQL старше 9.0

В июле 2014 года закончился срок поддержки PostgreSQL 8.4. Как следствие, Django 1.8 устанавливает 9.0 в качестве минимальной версии PostgreSQL, которую он официально поддерживает.

Это также включает отказ от поддержки PostGIS 1.3 и 1.4, поскольку эти версии не поддерживаются на версиях PostgreSQL позже 8.4.

Django также теперь требует использования Psycopg2 версии 2.4.5 или выше (или 2.5+, если вы хотите использовать django.contrib.postgres).

Поддержка версий MySQL старше 5.5

Окончание срока поддержки было достигнуто в январе 2012 года для MySQL 5.0 и в декабре 2013 года для MySQL 5.1. Как следствие, Django 1.8 устанавливает 5.5 в качестве минимальной версии MySQL, которую он официально поддерживает.

Поддержка версий Oracle старше 11.1

Окончание периода поддержки было достигнуто в июле 2010 года для Oracle 9.2, в январе 2012 года для Oracle 10.1 и в июле 2013 года для Oracle 10.2. Как следствие, Django 1.8 устанавливает 11.1 в качестве минимальной версии Oracle, которую он официально поддерживает.

Использование специфических привилегий вместо ролей для тестов на Oracle

В предыдущих версиях Django тестовому пользователю на Oracle предоставлялись роли CONNECT и RESOURCE. Эти роли были устаревшими, поэтому Django 1.8 вместо них использует конкретные базовые привилегии. Это изменяет привилегии, требуемые от основного пользователя для запуска тестов (если только проект не настроен так, чтобы не создавать тестового пользователя). Точные привилегии, требуемые сейчас, подробно описаны в Oracle notes.

AbstractUser.last_login допускает нулевые значения

Поле AbstractUser.last_login теперь допускает нулевые значения. Ранее оно по умолчанию указывало время, когда пользователь был создан, что вводило в заблуждение, если пользователь никогда не входил в систему. Если вы используете пользователя по умолчанию (django.contrib.auth.models.User), запустите миграцию базы данных, включенную в contrib.auth.

Если вы используете пользовательскую модель пользователя, которая наследуется от AbstractUser, вам нужно выполнить makemigrations и сгенерировать миграцию для вашего приложения, содержащего эту модель. Также, если вы хотите установить last_login в NULL для пользователей, которые не вошли в систему, вы можете выполнить следующий запрос:

from django.db import models
from django.contrib.auth import get_user_model
from django.contrib.auth.models import AbstractBaseUser

UserModel = get_user_model()
if issubclass(UserModel, AbstractBaseUser):
    UserModel._default_manager.filter(
        last_login=models.F('date_joined')
    ).update(last_login=None)

django.contrib.gis

  • Поддержка GEOS 3.1 и GDAL 1.6 была прекращена.
  • Поддержка SpatiaLite < 2.4 была прекращена.
  • Поиск, специфичный для ГИС, был переработан для использования API django.db.models.Lookup.
  • Представление по умолчанию str объектов GEOSGeometry было изменено с формата WKT на формат EWKT (включая SRID). Поскольку это представление используется во фреймворке сериализации, это означает, что вывод dumpdata теперь будет содержать значение SRID геометрических объектов.

Приоритет контекстных процессоров для TemplateResponse приведен в соответствие с render

Конструктор TemplateResponse предназначен для замены функции render(). Однако в нем была небольшая несовместимость, заключающаяся в том, что для TemplateResponse контекстные данные из переданного контекстного словаря могли быть затенены контекстными данными, возвращаемыми контекстными процессорами, тогда как для render все было наоборот. Это была ошибка, и поведение render является более подходящим, поскольку позволяет переопределять глобально определенные контекстные процессоры локально в представлении. Если вы полагались на то, что контекстные данные в TemplateResponse могут быть переопределены с помощью контекстного процессора, вам придется изменить свой код.

Переопределение setUpClass / tearDownClass в тестовых примерах

Декораторы override_settings() и modify_settings() теперь действуют на уровне класса, когда используются в качестве декораторов класса. Как следствие, при переопределении setUpClass() или tearDownClass() всегда следует вызывать реализацию super.

Удаление django.contrib.formtools

Приложение formtools contrib было перенесено в отдельный пакет, а соответствующие страницы документации были обновлены или удалены.

Новый пакет доступен on GitHub и на PyPI.

Перезагрузка соединения с базой данных между тестами

Ранее Django закрывал соединения с базой данных между каждым тестом в рамках TestCase. Теперь это не так, поскольку Django теперь оборачивает весь TestCase в транзакцию. Если некоторые из ваших тестов полагались на старое поведение, вам следует унаследовать их от TransactionTestCase.

Очистка пространства имен django.template

Если вы полагались на частные API, открытые в модуле django.template, вам, возможно, придется импортировать их из django.template.base вместо этого.

Также были удалены частные API django.template.base.compile_string(), django.template.loader.find_template() и django.template.loader.get_template_from_string().

model атрибут на частных отношениях модели

В ранних версиях Django в модели с обратной связью по внешнему ключу (например) метод model._meta.get_all_related_objects() возвращал связь как django.db.models.related.RelatedObject с атрибутом model, установленным на источник связи. Теперь этот метод возвращает отношение как django.db.models.fields.related.ManyToOneRel (частный API RelatedObject был удален), а атрибут model устанавливается на цель отношения вместо источника. Модель источника доступна по атрибуту related_model.

Рассмотрим этот пример из учебника по Django 1.8:

>>> p = Poll.objects.get(pk=1)
>>> p._meta.get_all_related_objects()
[<ManyToOneRel: polls.choice>]
>>> p._meta.get_all_related_objects()[0].model
<class 'polls.models.Poll'>
>>> p._meta.get_all_related_objects()[0].related_model
<class 'polls.models.Choice'>

и сравните его с поведением на более старых версиях:

>>> p._meta.get_all_related_objects()
[<RelatedObject: polls:choice related to poll>]
>>> p._meta.get_all_related_objects()[0].model
<class 'polls.models.Choice'>

Для доступа к исходной модели вы можете использовать паттерн, подобный этому, чтобы написать код, который будет работать как с Django 1.8, так и с более старыми версиями:

for relation in opts.get_all_related_objects():
    to_model = getattr(relation, 'related_model', relation.model)

Также обратите внимание, что get_all_related_objects() устарело в версии 1.8.

API бэкенда базы данных

Следующие изменения в API бэкенда базы данных документированы, чтобы помочь тем, кто пишет сторонние бэкенды, обновить свой код:

  • Классы BaseDatabaseXXX были перемещены в django.db.backends.base. Пожалуйста, импортируйте их из новых мест:

    from django.db.backends.base.base import BaseDatabaseWrapper
    from django.db.backends.base.client import BaseDatabaseClient
    from django.db.backends.base.creation import BaseDatabaseCreation
    from django.db.backends.base.features import BaseDatabaseFeatures
    from django.db.backends.base.introspection import BaseDatabaseIntrospection
    from django.db.backends.base.introspection import FieldInfo, TableInfo
    from django.db.backends.base.operations import BaseDatabaseOperations
    from django.db.backends.base.schema import BaseDatabaseSchemaEditor
    from django.db.backends.base.validation import BaseDatabaseValidation
    
  • Атрибуты data_types, data_types_suffix и data_type_check_constraints перешли из класса DatabaseCreation в DatabaseWrapper.

  • Метод SQLCompiler.as_sql() теперь принимает параметр subquery (#24164).

  • Метод BaseDatabaseOperations.date_interval_sql() теперь принимает только параметр timedelta.

django.contrib.admin

  • AdminSite больше не принимает аргумент app_name и его атрибут app_name был удален. Имя приложения всегда admin (в отличие от имени экземпляра, которое вы все еще можете настроить с помощью AdminSite(name="...").
  • Метод ModelAdmin.get_object() (частный API) теперь принимает третий аргумент from_field, чтобы указать, какое поле должно соответствовать предоставленному object_id.
  • Метод ModelAdmin.response_delete() теперь принимает второй аргумент obj_id, который является сериализованным идентификатором, используемым для получения объекта перед удалением.

Автоэскейп функций по умолчанию в django.template.defaultfilters

Чтобы сделать встроенные фильтры шаблонов, выводящие HTML, «безопасными по умолчанию» при вызове их в коде Python, следующие функции в django.template.defaultfilters были изменены, чтобы автоматически экранировать их входное значение:

  • join
  • linebreaksbr
  • linebreaks_filter
  • linenumbers
  • unordered_list
  • urlize
  • urlizetrunc

Вы можете вернуться к старому поведению, указав autoescape=False, если вы передаете доверенное содержимое. Это изменение не влияет на использование соответствующих фильтров в шаблонах.

Разное

  • connections.queries теперь является атрибутом только для чтения.

  • Соединения базы данных считаются одинаковыми, только если они являются одним и тем же объектом. Они больше не являются хэшируемыми.

  • GZipMiddleware используется для отключения сжатия для некоторых типов контента при запросе из Internet Explorer, чтобы обойти ошибку в IE6 и более ранних версиях. Такое поведение могло повлиять на производительность в IE7 и более поздних версиях. Оно было удалено.

  • URLField.to_python больше не добавляет косую черту в URL без пути.

  • Фильтр шаблона length теперь возвращает 0 для неопределенной переменной, а не пустую строку.

  • ForeignKey.default_error_message['invalid'] был изменен с '%(model)s instance with pk %(pk)r does not exist.' на '%(model)s instance with %(field)s %(value)r does not exist.' Если вы используете это сообщение в своем собственном коде, пожалуйста, обновите список интерполируемых параметров. Внутри Django будет продолжать предоставлять параметр pk в params для обратной совместимости.

  • UserCreationForm.error_messages['duplicate_username'] больше не используется. Если вы хотите настроить это сообщение об ошибке, override it on the form используйте ключ 'unique' в Meta.error_messages['username'] или, если у вас есть пользовательское поле формы для 'username', используйте ключ 'unique' в его аргументе error_messages.

  • Блок usertools в шаблоне base.html шаблона django.contrib.admin теперь требует установки контекстной переменной has_permission. Если у вас есть пользовательские представления администратора, использующие этот шаблон, обновите их, чтобы передать AdminSite.has_permission() в качестве значения этой новой переменной или просто включите AdminSite.each_context(request) в контекст.

  • В виджет ClearableFileInput были внесены внутренние изменения, позволяющие больше настраивать его. Недокументированный атрибут url_markup_template был удален в пользу template_with_initial.

  • Для согласованности с другими крупными производителями, локаль en_GB теперь имеет понедельник в качестве первого дня недели.

  • Секунды были удалены из всех локалей, которые имели их в TIME_FORMAT, DATETIME_FORMAT или SHORT_DATETIME_FORMAT.

  • Максимальный размер тестового табличного пространства Oracle по умолчанию увеличился с 300M (или 200M, до версии 1.7.2) до 500M.

  • reverse() и reverse_lazy() теперь возвращают строки Unicode вместо байтстрингов.

  • Псевдоним CacheClass был удален из всех бэкендов кэша. Эти псевдонимы были предоставлены для обратной совместимости с Django 1.3. Если вы все еще используете их, пожалуйста, обновите свой проект, чтобы использовать реальное имя класса, найденное в ключе BACKEND параметра CACHES.

  • По умолчанию call_command() теперь всегда пропускает рамки проверки (если только вы не передадите ему skip_checks=False).

  • При итерации по строкам File теперь используется universal newlines. В качестве конца строки распознаются: соглашение Unix о конце строки '\n', соглашение Windows '\r\n' и старое соглашение Macintosh '\r'.

  • Кэш-бэкенды Memcached MemcachedCache и PyLibMCCache удаляют ключ, если set() не работает. Это необходимо для того, чтобы хранилище сессий cache_db всегда получало самые актуальные данные сессии.

  • Частные API override_template_loaders и override_with_test_loader в django.test.utils были удалены. Вместо них переопределите TEMPLATES с помощью override_settings.

  • Предупреждения от бэкенда базы данных MySQL больше не преобразуются в исключения, когда DEBUG становится True.

  • HttpRequest теперь имеет упрощенное repr (например, <WSGIRequest: GET '/somepath/'>). Это не изменит поведение класса SafeExceptionReporterFilter.

  • Представления на основе классов, использующие ModelFormMixin, будут вызывать исключение ImproperlyConfigured, если указаны оба атрибута fields и form_class. Ранее fields молча игнорировалось.

  • При выполнении перенаправлений тестовый клиент теперь поднимает RedirectCycleError, если обнаруживает цикл или достигает максимального предела перенаправления (а не проходит молча).

  • Переводимые строки, заданные в качестве параметра поля default, впоследствии приводятся к конкретным строкам, поэтому в некоторых случаях возвращаемый тип Field.get_default() отличается. Значения по умолчанию, которые являются результатом вызываемого поля, не изменяются.

  • GenericIPAddressField.empty_strings_allowed теперь False. Бэкенды баз данных, которые интерпретируют пустые строки как null (среди бэкендов, которые включает Django, только Oracle), больше не будут преобразовывать нулевые значения обратно в пустую строку. Это соответствует другим бэкендам.

  • Когда атрибут BaseCommand.leave_locale_alone имеет значение False, переводы теперь деактивируются вместо принудительной установки локали «en-us». В случае, если ваши модели содержали неанглийские строки и вы рассчитывали на то, что в командах управления будут активированы английские переводы, этого больше не произойдет. Возможно, после перехода на 1.8 создаются новые миграции базы данных (один раз).

  • django.utils.translation.get_language() теперь возвращает None вместо LANGUAGE_CODE, когда переводы временно отключены.

  • Если для определенного литерала не существует перевода, то обратный перевод теперь берется из языка LANGUAGE_CODE (а не из непереведенного сообщения msgid).

  • Поле name в django.contrib.contenttypes.models.ContentType было удалено в результате миграции и заменено свойством. Это означает, что больше нельзя запрашивать или фильтровать ContentType по этому полю.

    Будьте осторожны, если вы переходите на Django 1.8 и пропускаете Django 1.7. Если вы выполните manage.py migrate --fake, эта миграция будет пропущена, и вы увидите исключение RuntimeError: Error creating new content types., поскольку столбец name не будет удален из базы данных. Используйте manage.py migrate --fake-initial, чтобы сымитировать только начальную миграцию.

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

  • Переход от приложения без миграций с ForeignKey к приложению с миграциями теперь может привести к ошибке ограничения внешнего ключа при миграции базы данных или выполнении тестов. В Django 1.7 это могло происходить молча и приводить к отсутствию ограничения. Чтобы устранить ошибку, добавьте миграции в приложение без них.

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

Выбранные методы в django.db.models.options.Options

В рамках формализации API Model._meta (из класса django.db.models.options.Options), ряд методов были устаревшими и будут удалены в Django 1.10:

  • get_all_field_names()
  • get_all_related_objects()
  • get_all_related_objects_with_model()
  • get_all_related_many_to_many_objects()
  • get_all_related_m2m_objects_with_model()
  • get_concrete_fields_with_model()
  • get_field_by_name()
  • get_fields_with_model()
  • get_m2m_with_model()

Загрузка тегов шаблонов cycle и firstof из библиотеки future

Django 1.6 ввел синтаксис {% load cycle from future %} и {% load firstof from future %} для совместимости с тегами шаблонов cycle и firstof. Сейчас этот синтаксис устарел и будет удален в Django 1.10. Вы можете просто удалить теги {% load ... from future %}.

django.conf.urls.patterns()

В старые добрые времена Django рекомендовалось ссылаться на представления как на строки в urlpatterns:

urlpatterns = patterns('',
    url('^$', 'myapp.views.myview'),
)

и Django волшебным образом импортирует myapp.views.myview внутрь и превратит строку в реальную ссылку на функцию. Для того, чтобы уменьшить количество повторений при обращении ко многим представлениям из одного и того же модуля, функция patterns() принимает необходимый начальный prefix аргумент, который добавляется ко всем представлениям как строкам в этом наборе urlpatterns:

urlpatterns = patterns('myapp.views',
    url('^$', 'myview'),
    url('^other/$', 'otherview'),
)

В современную эпоху мы обновили учебник и теперь рекомендуем импортировать модуль представлений и ссылаться на функции (или классы) представлений напрямую. Это имеет ряд преимуществ, все из которых вытекают из того, что мы используем обычный Python вместо «Django String Magic»: ошибки, когда вы неправильно вводите имя представления, менее непонятны, IDE могут помочь с автозаполнением имен представлений и т.д.

Поэтому в наши дни вышеприведенное использование аргумента prefix с гораздо большей вероятностью будет записано (и лучше записано) как:

from myapp import views

urlpatterns = patterns('',
    url('^$', views.myview),
    url('^other/$', views.otherview),
)

Таким образом, patterns() служит мало для чего и является обучением новых пользователей (отвечая на вопрос новичка «зачем мне нужна эта пустая строка в качестве первого аргумента для patterns()?»). По этим причинам мы отказываемся от него. Обновить код так же просто, как убедиться, что urlpatterns является списком экземпляров django.conf.urls.url(). Например:

from django.conf.urls import url
from myapp import views

urlpatterns = [
    url('^$', views.myview),
    url('^other/$', views.otherview),
]

Передача строки в виде view в url()

В связи с предыдущим пунктом, ссылки на представления как на строки в функции url() устарели. Вместо этого передавайте вызываемое представление, как описано в предыдущем разделе.

django.core.context_processors

Встроенные контекстные процессоры шаблонов были перемещены в django.template.context_processors.

django.test.SimpleTestCase.urls

Атрибут SimpleTestCase.urls для указания конфигурации URLconf в тестах был устаревшим и будет удален в Django 1.10. Вместо него используйте @override_settings(ROOT_URLCONF=...).

prefix аргумент к i18n_patterns()

В связи с предыдущим пунктом, аргумент prefix для django.conf.urls.i18n.i18n_patterns() был устаревшим. Вместо этого просто передавайте список экземпляров django.conf.urls.url().

Использование неправильного подсчета распакованных значений в теге шаблона for

Использование неправильного подсчета распакованных значений в теге for вызывает исключение, а не молчаливый отказ в Django 1.10.

Передача точечного пути в reverse() и url

Реверсирование URL по пути Python является дорогостоящей операцией, поскольку это приводит к импорту реверсируемого пути. Такое поведение также привело к появлению security issue. Вместо этого используйте named URL patterns для реверсирования.

Если вы используете django.contrib.sitemaps, добавьте аргумент name к аргументу url, который ссылается на django.contrib.sitemaps.views.sitemap():

from django.contrib.sitemaps.views import sitemap

url(r'^sitemap\.xml$', sitemap, {'sitemaps': sitemaps},
    name='django.contrib.sitemaps.views.sitemap')

для обеспечения совместимости при реверсировании по пути Python удалена в Django 1.10.

Аналогично для GIS sitemaps добавьте name='django.contrib.gis.sitemaps.views.kml' или name='django.contrib.gis.sitemaps.views.kmz'.

Если вы используете путь Python для параметра LOGIN_URL или LOGIN_REDIRECT_URL, используйте вместо него имя параметра url().

Агрегатные методы и модули

Модули django.db.models.sql.aggregates и django.contrib.gis.db.models.sql.aggregates (оба частные API) были устаревшими, так как django.db.models.aggregates и django.contrib.gis.db.models.aggregates теперь также отвечают за генерацию SQL. Старые модули будут удалены в Django 1.10.

Если вы использовали старые модули, смотрите Query Expressions для инструкций по переписыванию пользовательских агрегатов с использованием нового стабильного API.

Следующие методы и свойства django.db.models.sql.query.Query также были устаревшими, и в Django 1.10 будут удалены в связи с обратной совместимостью:

  • Query.aggregates, заменяется на annotations.
  • Query.aggregate_select, заменяется на annotation_select.
  • Query.add_aggregate(), заменяется на add_annotation().
  • Query.set_aggregate_mask(), заменяется на set_annotation_mask().
  • Query.append_aggregate_mask(), заменяется на append_annotation_mask().

Расширение аргументов команд управления через Command.option_list

Команды управления теперь используют :py<<<<0 >>> вместо :py<<<<1 >>> для разбора аргументов командной строки, передаваемых командам. Это также означает, что изменился способ добавления пользовательских аргументов в команды: вместо расширения списка классов argparse теперь следует переопределить метод optparse и добавлять аргументы через option_list. Более подробную информацию смотрите в add_arguments().

django.core.management.NoArgsCommand

Класс NoArgsCommand сейчас устарел и будет удален в Django 1.10. Вместо него используйте BaseCommand, который по умолчанию не принимает аргументов.

Перечисление всех миграций в проекте

Опция --list команды управления migrate устарела и будет удалена в Django 1.10. Вместо этого используйте showmigrations.

cache_choices вариант ModelChoiceField и ModelMultipleChoiceField

ModelChoiceField и ModelMultipleChoiceField использовали недокументированную, непроверенную опцию cache_choices. Она кэшировала наборы запросов между несколькими рендерами одного и того же объекта Form. Эта опция подлежит ускоренной депривации и будет удалена в Django 1.9.

django.template.resolve_variable()

Эта функция уже некоторое время неофициально помечена как «Устаревшая». Замените resolve_variable(path, context) на django.template.Variable(path).resolve(context).

django.contrib.webdesign

В нем был предусмотрен тег шаблона lorem, который теперь включен во встроенные теги. Просто удалите 'django.contrib.webdesign' из INSTALLED_APPS и {% load webdesign %} из ваших шаблонов.

error_message аргумент к django.forms.RegexField

Он обеспечивает обратную совместимость с кодом до версии 1.0, но его функциональность избыточна. Вместо него используйте Field.error_messages['invalid'].

Старый синтаксис unordered_list

Старый (до версии 1.0), более строгий и многословный формат ввода для фильтра шаблонов unordered_list был устаревшим:

['States', [['Kansas', [['Lawrence', []], ['Topeka', []]]], ['Illinois', []]]]

Используя новый синтаксис, это становится:

['States', ['Kansas', ['Lawrence', 'Topeka'], 'Illinois']]

django.forms.Field._has_changed()

Переименуйте этот метод в has_changed(), удалив ведущее подчеркивание. Старое имя будет работать до версии Django 1.10.

django.utils.html.remove_tags() и removetags шаблонный фильтр

django.utils.html.remove_tags(), а также шаблонный фильтр removetags были устаревшими, поскольку они не могут гарантировать безопасный вывод. Их существование, скорее всего, приведет к использованию их в чувствительных к безопасности контекстах, где они на самом деле не являются безопасными.

Неиспользуемая и недокументированная функция django.utils.html.strip_entities() также была упразднена.

is_admin_site аргумент к django.contrib.auth.views.password_reset()

Это унаследованная опция, в которой больше нет необходимости.

SubfieldBase

django.db.models.fields.subclassing.SubfieldBase был устаревшим и будет удален в Django 1.10. Исторически он использовался для обработки полей, где требовалось преобразование типов при загрузке из базы данных, но он не использовался в вызовах .values() или в агрегатах. Он был заменен на from_db_value().

Новый подход не вызывает метод to_python() при присваивании, как это было в случае SubfieldBase. Если вам нужно такое поведение, перереализуйте класс Creator from Django’s source code в своем проекте.

django.utils.checksums

Модуль django.utils.checksums был устаревшим и будет удален в Django 1.10. Функциональность, которую он предоставлял (проверка контрольной суммы по алгоритму Luhn), была недокументирована и не использовалась в Django. Модуль был перемещен в пакет django-localflavor (версия 1.1+).

InlineAdminForm.original_content_type_id

Атрибут original_content_type_id на InlineAdminForm был устаревшим и будет удален в Django 1.10. Исторически он использовался для построения URL «view on site». Теперь этот URL доступен с помощью атрибута absolute_url формы.

аргумент django.views.generic.edit.FormMixin.get_form() form_class

Подклассы FormMixin, которые переопределяют метод get_form(), должны позаботиться о предоставлении значения по умолчанию для аргумента form_class, поскольку теперь он является необязательным.

Рендеринг шаблонов, загруженных get_template() с помощью Context

Тип возврата get_template() изменился в Django 1.8: вместо django.template.Template он возвращает экземпляр Template, точный тип которого зависит от того, какой бэкенд его загрузил.

Оба класса предоставляют метод render(), однако первый принимает в качестве аргумента django.template.Context, а второй ожидает dict. Это изменение вводится в действие через путь обесценивания для шаблонов Django.

Все это также относится и к select_template().

Классы Template и Context в шаблонных ответах

Некоторые методы SimpleTemplateResponse и TemplateResponse принимали в качестве аргументов объекты django.template.Context и django.template.Template. Теперь они должны принимать dict и объекты шаблона, зависящего от бэкенда, соответственно.

Это также относится к типам возврата, если вы подклассифицировали любой из классов шаблона ответа.

Подробности смотрите в template response API documentation.

dictionary и context_instance аргументы функций рендеринга

Следующие функции больше не будут принимать параметры dictionary и context_instance в Django 1.10:

  • django.shortcuts.render()
  • django.shortcuts.render_to_response()
  • django.template.loader.render_to_string()

Вместо этого используйте параметр context. Когда dictionary передается как позиционный аргумент, что является наиболее распространенной идиомой, никаких изменений не требуется.

Если вы передаете Context в параметре context_instance, вместо него передайте dict в параметре context. Если вы передаете RequestContext, передайте запрос отдельно в параметре request.

dirs аргумент функций поиска шаблонов

Следующие функции больше не будут принимать параметр dirs для переопределения TEMPLATE_DIRS в Django 1.10:

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

django.template.loader.BaseLoader

django.template.loader.BaseLoader был переименован в django.template.loaders.base.Loader. Если вы написали пользовательский загрузчик шаблонов, который наследует BaseLoader, вы должны наследовать Loader вместо него.

django.test.utils.TestTemplateLoader

Приватный API django.test.utils.TestTemplateLoader устарел в пользу django.template.loaders.locmem.Loader и будет удален в Django 1.9.

Поддержка аргумента max_length в пользовательских классах Storage

<<< Подклассы Storage должны добавить max_length=None в качестве параметра к get_available_name() и/или save(), если они переопределяют любой из методов. Поддержка хранилищ, не принимающих этот аргумент, будет удалена в Django 1.10.

qn заменяется на compiler

В предыдущих версиях Django различные внутренние методы ORM (в основном методы as_sql) принимали аргумент qn (для «quote name»), который представлял собой ссылку на функцию, цитирующую идентификаторы для отправки в базу данных. В Django 1.8 этот аргумент был переименован в compiler и теперь является полноценным экземпляром SQLCompiler. Для обратной совместимости вызов экземпляра SQLCompiler выполняет то же цитирование имен, что и функция qn. Однако, этот шим для обратной совместимости немедленно устаревает: вы должны переименовать ваши аргументы qn в compiler, и вызывать compiler.quote_name_unless_alias(...) там, где раньше вызывали qn(...).

Значение по умолчанию RedirectView.permanent

Значение по умолчанию атрибута RedirectView.permanent изменится с True на False в Django 1.9.

Использование AuthenticationMiddleware без SessionAuthenticationMiddleware

django.contrib.auth.middleware.SessionAuthenticationMiddleware был добавлен в Django 1.7. В Django 1.7.2 его функциональность была перенесена в auth.get_user() и, для обратной совместимости, включена только если 'django.contrib.auth.middleware.SessionAuthenticationMiddleware' появляется в MIDDLEWARE_CLASSES.

В Django 1.10 проверка сессии будет включена независимо от того, включена ли SessionAuthenticationMiddleware или нет (в этот момент SessionAuthenticationMiddleware не будет иметь никакого значения). Вы можете добавить ее в MIDDLEWARE_CLASSES как-нибудь до этого времени, чтобы отказаться от использования. Пожалуйста, сначала прочитайте upgrade considerations.

django.contrib.sitemaps.FlatPageSitemap

django.contrib.sitemaps.FlatPageSitemap переместился в django.contrib.flatpages.sitemaps.FlatPageSitemap. Старое расположение импорта устарело и будет удалено в Django 1.9.

ssi тег шаблона

Тег шаблона ssi позволяет включать файлы в шаблон по абсолютному пути. Это ограниченное использование в большинстве ситуаций развертывания, и тег include часто имеет больше смысла. Этот тег устарел и будет удален в Django 1.10.

= как оператор сравнения в теге шаблона if

Использование одиночного знака равенства с тегом шаблона {% if %} для проверки равенства было недокументированным и непроверенным. Теперь оно устарело в пользу ==.

Синтаксис %(<foo>)s в ModelFormMixin.success_url

Устаревший синтаксис %(<foo>)s в ModelFormMixin.success_url является устаревшим и будет удален в Django 1.10.

GeoQuerySet агрегатные методы

Агрегатные методы collect(), extent(), extent3d(), make_line() и unionagg() устарели и должны быть заменены их агрегатными эквивалентами на основе функций (Collect, Extent, Extent3D, MakeLine и Union).

Сигнатура метода маршрутизатора allow_migrate

Подпись метода allow_migrate() маршрутизаторов базы данных изменилась с allow_migrate(db, model) на allow_migrate(db, app_label, model_name=None, **hints).

Когда установлено значение model_name, значение, которое ранее было задано через позиционный аргумент model, теперь может быть найдено в словаре hints под ключом 'model'.

После перехода на новую сигнатуру маршрутизатор также будет вызываться операциями RunPython и RunSQL.

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

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

  • django.contrib.comments удаляется.
  • Следующие API управления транзакциями удалены:
    • TransactionMiddleware
    • декораторы и менеджеры контекста autocommit, commit_on_success и commit_manually, определенные в django.db.transaction
    • функции commit_unless_managed и rollback_unless_managed, также определенные в django.db.transaction.
    • установка TRANSACTIONS_MANAGED
  • Теги шаблонов cycle и firstof автоэскейпируют свои аргументы.
  • Настройка SEND_BROKEN_LINK_EMAILS удаляется.
  • django.middleware.doc.XViewMiddleware удаляется.
  • Псевдоним Model._meta.module_name удален.
  • Удалены обратно совместимые шиммы, введенные для переименования get_query_set и подобных методов queryset. Это затрагивает следующие классы: BaseModelAdmin, ChangeList, BaseCommentNode, GenericForeignKey, Manager, SingleRelatedObjectDescriptor и ReverseSingleRelatedObjectDescriptor.
  • Удалены шиммы обратной совместимости, введенные для переименования атрибутов ChangeList.root_query_set и ChangeList.query_set.
  • django.views.defaults.shortcut и django.conf.urls.shortcut удаляются.
  • Удалена поддержка модуля Python Imaging Library (PIL).
  • Следующие частные API удалены:
    • django.db.backend
    • django.db.close_connection()
    • django.db.backends.creation.BaseDatabaseCreation.set_autocommit()
    • django.db.transaction.is_managed()
    • django.db.transaction.managed()
  • django.forms.widgets.RadioInput удаляется.
  • Модуль django.test.simple и класс django.test.simple.DjangoTestSuiteRunner удалены.
  • Модуль django.test._doctest удаляется.
  • Настройка CACHE_MIDDLEWARE_ANONYMOUS_ONLY удалена. Это изменение затрагивает как django.middleware.cache.CacheMiddleware, так и django.middleware.cache.UpdateCacheMiddleware, несмотря на отсутствие предупреждения об устаревании в последнем классе.
  • Использование жестко закодированной Удерживайте «Control», или «Command» на Mac, чтобы выбрать более одной. строки для переопределения или добавления к предоставленным пользователем help_text в формах для ManyToMany полей модели больше не выполняется Django ни на уровне модели, ни на уровне форм.
  • Методы Model._meta.get_(add|change|delete)_permission удалены.
  • Ключ сессии django_language больше не считывается для обратной совместимости.
  • Географические карты сайтов удалены (django.contrib.gis.sitemaps.views.index и django.contrib.gis.sitemaps.views.sitemap).
  • django.utils.html.fix_ampersands, фильтр шаблона fix_ampersands и django.utils.html.clean_html удалены.
Вернуться на верх