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

1 апреля 2015 г.

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

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

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

Django 1.8 был обозначен как второй выпуск долгосрочной поддержки Django . Он будет получать обновления безопасности в течение как минимум трех лет после выпуска. Поддержка предыдущего 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._metaAPI

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

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

Множественные движки шаблонов

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

Улучшения безопасности

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

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

Django теперь имеет модуль с расширениями для специфических функций PostgreSQL, такие , как ArrayField, HStoreField, Range Fields и unaccentпоиск. Полная разбивка функций доступна в документации .

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

  • В Django теперь есть UUIDFieldуниверсальные уникальные идентификаторы. Он хранится как собственный uuidтип данных в PostgreSQL и как символьное поле фиксированной длины на других серверах. Есть соответствующий .form field
  • В Django теперь есть инструмент DurationFieldдля хранения периодов времени - смоделированный на Python с помощью timedelta. Он хранится в собственном intervalтипе данных в PostgreSQL, как в Oracle и как в микросекундах на других серверах. Арифметика, связанная с датой и временем, также была улучшена во всех бэкэндах. Есть соответствующий .INTERVAL DAY(9) TO SECOND(6)bigintform field

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

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

Условные выражения позволяют использоватьif...elif...elseлогика в запросах.

Коллекция функций базы данных также включены функциональные возможности, такие как 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 .
  • Например, теперь можно включить подзапрос в качестве аргумента географического поиска City.objects.filter(point__within=Country.objects.filter(continent='Africa').values('mpoly')).
  • Серверная часть SpatiaLite теперь поддерживает Collectи Extentагрегирует, когда версия базы данных - 3.0 или новее.
  • Команды инициализации PostGIS 2 и SpatiaLite теперь автоматически запускаются .CREATE EXTENSION postgisSELECT InitSpatialMetaDatamigrate
  • Интерфейс GDAL теперь поддерживает получение свойств файла растровых (изображений) данных .
  • Прокладки совместимости SpatialRefSysи GeometryColumnsизменения в Django 1.2 были удалены.
  • Все исключения, связанные с GDAL, теперь вызываются с помощью GDALException. Первый OGRExceptionбыл сохранен для обратной совместимости, но его больше не следует использовать.

django.contrib.sessions

  • Файл cookie сеанса теперь удаляется после 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 для получения более подробной информации.
  • Серверная часть MySQL больше не создает явные индексы для внешних ключей при использовании механизма хранения InnoDB, поскольку MySQL уже создает их автоматически.
  • Серверная часть Oracle больше не определяет эту connection_persists_old_columns функцию как True. Вместо этого Oracle теперь будет включать предложение об очистке кеша при получении описания таблицы.

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

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

Формы

  • Виджеты форм теперь отображают атрибуты со значением 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атрибут, содержащий Imageэкземпляр Pillow, используемый для проверки того, является ли файл допустимым изображением. Он также обновится UploadedFile.content_typeс учетом типа содержимого изображения, определенного Pillow.
  • Теперь вы можете передать вызываемый объект, который возвращает итерацию вариантов при создании экземпляра ChoiceField.

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

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

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

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

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

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

  • Соединения с базой данных теперь всегда закрываются после того, как команда управления, вызванная из командной строки, завершила свою работу.
  • Теперь также обнаружены команды из альтернативных форматов пакетов, таких как яйца.
  • Новая опция позволяет указать файл, в который записываются сериализованные данные.dumpdata --output
  • Новые и опции позволяют исключить конкретные локали от обработки.makemessages --excludecompilemessages --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команда позволяет вывести список всех миграций и их зависимостей в проекте.

Промежуточное ПО

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

Миграции

Модели

  • Django теперь регистрирует не более 9000 запросов connections.queries, чтобы предотвратить чрезмерное использование памяти длительными процессами в режиме отладки.
  • Теперь есть Metaопция модели для определения для всех реляционных полей модели.default related name
  • Модели комплектации и наборы запросов в разных версиях Django официально не поддерживаются (может работать, но нет никаких гарантий). Дополнительная переменная, указывающая текущую версию Django, теперь добавляется к состоянию маринования моделей и RuntimeWarning наборов запросов , и Django выдает a, когда эти объекты распакованы в версии, отличной от той, в которой они были маринованы.
  • Добавлено, Model.from_db()что Django использует всякий раз, когда объекты загружаются с помощью ORM. Метод позволяет настроить поведение загрузки модели.
  • extra(select={...})теперь позволяет избежать буквальной %sпоследовательности с помощью %%s.
  • Пользовательские поисковые запросы теперь можно зарегистрировать с помощью шаблона декоратора.
  • Новый 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 больше не делает этого.

Фреймворк проверки системы

  • 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и запрос вызывает a 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 в памяти при использовании Python 3.4+ и SQLite 3.7.13+. Это позволяет разделять базу данных между потоками.

Валидаторы

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

Задом несовместимые изменения в 1.8

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

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

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

Примечание

Чтобы упростить использование моделей в памяти, это изменение было отменено в 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командную переменную, вы можете получить сообщение об ошибке, например , поскольку анализ переменных теперь основан на том, что неявно не принимает позиционные аргументы. Вы можете сделать свою команду обратно совместимой, просто установив переменную класса. Однако, если вам не нужно поддерживать совместимость со старыми версиями Django, лучше реализовать новый метод, как описано в разделе Написание пользовательских команд django-admin .Error: unrecognized arguments: ...argparseargsadd_arguments()

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

testИзменился метод добавления настраиваемых аргументов в команду управления через средство запуска тестов. Раньше вы могли предоставить option_list переменную класса в средстве выполнения тестов для добавления дополнительных аргументов (а ля optparse). Теперь, чтобы реализовать такое же поведение, вам нужно создать метод класса в средстве выполнения тестов и вызвать его для добавления любых настраиваемых аргументов, поскольку синтаксический анализатор теперь является экземпляром.add_arguments(cls, parser)parser.add_argumentargparse.ArgumentParser

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

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

Конец периода поддержки восходящего потока для PostgreSQL 8.4 был достигнут в июле 2014 года. Как следствие, 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 .

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 прекращена.
  • Поисковые запросы, специфичные для ГИС, были переработаны для использования django.db.models.LookupAPI.
  • 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 было перемещено в отдельный пакет, а соответствующие страницы документации были обновлены или удалены.

Новый пакет доступен на 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']было изменено с на Если вы используете это сообщение в своем собственном коде, обновите список интерполированных параметров. Внутри Django продолжит предоставлять параметр для обратной совместимости.'%(model)s instance with pk %(pk)r does not exist.''%(model)s instance with %(field)s %(value)r does not exist.'pkparams

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

  • Блок usertoolsв base.htmlшаблоне django.contrib.adminnow требует, 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 увеличился с 300 МБ (или 200 МБ, до версии 1.7.2) до 500 МБ.

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

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

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

  • При итерации строк Fileтеперь использует универсальные символы новой строки . Следующее считается окончанием строки: соглашение 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()в некоторых случаях возвращаемый тип отличается. Нет никаких изменений в значениях по умолчанию, которые являются результатом callable.

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

  • Когда 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 --fakeRuntimeError: Error creating new content types.namemanage.py migrate --fake-initial

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

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

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

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

В рамках формализации Model._metaAPI (из 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 введен и синтаксис для прямой совместимости и шаблонных тегов. Этот синтаксис устарел и будет удален в Django 1.10. Вы можете просто удалить теги.{% load cycle from future %}{% load firstof from future %}cyclefirstof{% 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 могут помочь с автозаполнением имен представлений и т.

Итак, в наши дни вышеупомянутое использование prefixarg с большей вероятностью будет записано (и лучше написано) как:

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до django.conf.urls.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 - дорогостоящая операция, поскольку она приводит к импорту обратного пути. Такое поведение также привело к проблеме безопасности . Вместо этого используйте именованные шаблоны URL-адресов для реверсирования.

Если вы используете 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.

Аналогично для карт сайта ГИС добавьте 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.

Если вы использовали старые модули, ознакомьтесь с инструкциями по переписыванию пользовательских агрегатов с помощью нового стабильного 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

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

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класс из исходного кода Django в своем проекте.

django.utils.checksums

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

InlineAdminForm.original_content_type_id

original_content_type_idАтрибут InlineAdminFormустарел и будет удален в Django 1.10. Исторически он использовался для создания URL-адреса «просмотр на сайте». Этот URL-адрес теперь доступен с помощью absolute_urlатрибута формы.

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

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

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

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

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

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

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

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

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

Дополнительную информацию см. В документации API ответа шаблона .

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

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 и подобных методов набора запросов, удалены. Это влияет на следующие классы: 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больше не читается для обратной совместимости.
  • Географические файлы Sitemap удалены ( django.contrib.gis.sitemaps.views.indexи django.contrib.gis.sitemaps.views.sitemap).
  • django.utils.html.fix_ampersands, fix_ampersandsфильтр шаблона и django.utils.html.clean_htmlудаляются.

Copyright ©2021 All rights reserved