Примечания к выпуску Django 1.8¶
1 апреля 2015 г.
Добро пожаловать в Джанго 1.8!
Эти примечания к выпуску охватывают новые функции, а также некоторые обратно несовместимые изменения, о которых вам следует знать при обновлении с Django 1.7 или более ранних версий. Мы также начали процесс прекращения поддержки некоторых функций, а некоторые функции достигли конца процесса устаревания и были удалены.
См. руководство Upgrading Django to a newer version, если вы обновляете существующий проект.
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 года.
Что нового в Джанго 1.8¶
Model._meta API¶
Django теперь имеет формализованный API для Model._meta, предоставляющий официально поддерживаемый способ извлекать поля и фильтровать поля на основе их атрибутов.
Объект Model._meta был частью Django со времен Magic Removal до версии 0.96 — он просто не был официальным стабильным API. Признавая это, мы постарались сохранить обратную совместимость со старой конечной точкой API, где это возможно. Однако конечные точки API, которые не являются частью нового официального API, устарели и в конечном итоге будут удалены.
Несколько шаблонизаторов¶
Django 1.8 определяет стабильный API для интеграции серверных частей шаблонов. Он включает встроенную поддержку языка шаблонов Django и Jinja2. Он поддерживает шаблоны рендеринга с использованием нескольких движков в одном проекте. Узнайте больше о новых функциях в тематическом руководстве и ознакомьтесь с инструкциями по обновлению в старых версиях документации.
Улучшения безопасности¶
Several features of the django-secure third-party library have been
integrated into Django. django.middleware.security.SecurityMiddleware
provides several security enhancements to the request/response cycle. The new
check --deploy option allows you to check your production settings
file for ways to increase the security of your site.
Новые специальные функции PostgreSQL.¶
В Django теперь есть модуль с расширениями для специфических функций PostgreSQL, таких как ArrayField, HStoreField, Поля диапазона и unaccent поиск. Полное описание функций доступно в документации.
Новые типы данных¶
В Django теперь есть
UUIDFieldдля хранения универсально уникальных идентификаторов. Он хранится как собственный тип данных uuid в PostgreSQL и как символьное поле фиксированной длины в других бэкендах. Существует соответствующееполе формы.В Django теперь есть
DurationFieldдля хранения периодов времени, смоделированный в Python с помощьюtimedelta. Он хранится в родном типе данных «интервал» в PostgreSQL, как «ИНТЕРВАЛ ДЕНЬ(9) ТО СЕКУНД(6)» в Oracle и как «бигинта» микросекунд в других бэкендах. Арифметика, связанная с датой и временем, также была улучшена на всех серверах. Существует соответствующееполе формы.
Выражения запроса, условные выражения и функции базы данных¶
Выражения запроса позволяют создавать, настраивать и составлять сложные выражения SQL. Это позволило аннотациям принимать выражения, отличные от агрегатов. Агрегаты теперь могут ссылаться на несколько полей, а также выполнять арифметические действия, аналогично объектам F(). order_by() также получил возможность принимать выражения.
Условные выражения позволяют использовать логику if … elif … else в запросах.
Коллекция функций базы данных также включена в состав таких функций, как Coalesce, Concat и Substr.
Настройка данных TestCase¶
TestCase был реорганизован, чтобы обеспечить инициализацию данных на уровне класса с использованием транзакций и точек сохранения. Серверные части баз данных, которые не поддерживают транзакции, такие как MySQL с механизмом хранения MyISAM, по-прежнему смогут выполнять эти тесты, но не получат выгоды от улучшений. Тесты теперь выполняются в двух вложенных блоках atomic(): один для всего класса и один для каждого теста.
The class method
TestCase.setUpTestData()adds the ability to setup test data at the class level. Using this technique can speed up the tests as compared to usingsetUp().Загрузка фикстуры в 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_lengthPermission.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(content='Africa').values('mpoly')).Серверная часть SpatiaLite теперь поддерживает агрегаты
CollectиExtent, если версия базы данных 3.0 или более поздняя.Команды инициализации PostGIS 2
CREATE EXTENSION postgisи SpatiaLiteSELECT InitSpatialMetaDataтеперь автоматически запускаютсяmigrate.Интерфейс GDAL теперь поддерживает получение свойств файла растровых данных (изображений) <raster-data-source-objects>`.
Прокладки совместимости для 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 теперь является потокобезопасным.
Криптография¶
Параметр
max_ageметодаdjango.core.signing.TimestampSigner.unsign()теперь также принимает объектdatetime.timedelta.
Серверные базы данных¶
Серверная часть 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для реализации ограничений максимальной длины имени файла на уровне хранилища. Имена файлов, превышающие этот аргумент, будут обрезаны. Это предотвращает ошибку базы данных при добавлении уникального суффикса к длинному имени файла, который уже существует в хранилище. См. примечание об устаревании <storage-max-length-update>` о добавлении этого аргумента в ваши пользовательские классы хранения.
Формы¶
Виджеты форм теперь отображают атрибуты со значением 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, содержащий экземпляр PillowImage, используемый для проверки того, является ли файл допустимым изображением. Он также обновит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теперь поддерживают синтаксис Pythonstr.format(). Устаревший синтаксис%(<foo>)sпо-прежнему поддерживается, но будет удален в Django 1.10.
Интернационализация¶
FORMAT_MODULE_PATHтеперь может быть списком строк, представляющих пути к модулям. Это позволяет импортировать несколько модулей формата из разных повторно используемых приложений. Это также позволяет переопределить эти пользовательские форматы в вашем основном проекте Django.
Ведение журнала¶
Класс
django.utils.log.AdminEmailHandlerтеперь имеет методsend_mail(), чтобы сделать его более дружественным к подклассам.
Команды управления¶
Соединения с базой данных теперь всегда закрываются после того, как команда управления, вызванная из командной строки, завершила свою работу.
Теперь также обнаруживаются команды из альтернативных форматов пакетов, таких как яйца.
Новая опция
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позволяет вывести список всех миграций и их зависимостей в проекте.
Промежуточное ПО¶
Атрибут
CommonMiddleware.response_redirect_classпозволяет вам настроить перенаправления, выполняемые промежуточным программным обеспечением.Отладочное сообщение будет записано в журнал
django.request, когда промежуточное программное обеспечение вызовет исключениеMiddlewareNotUsedв режимеDEBUG.
Миграции¶
Операция
RunSQLтеперь может обрабатывать параметры, передаваемые в операторы SQL.Теперь можно осуществлять миграцию (вероятнее всего, миграцию данных) для приложений без моделей.
Миграции теперь могут сериализовать менеджеры моделей как часть состояния модели.
Был добавлен универсальный механизм для обработки устаревших полей модели <migrations-removing-model-fields>.
Метод/атрибут класса
RunPython.noop()иRunSQL.noopбыл добавлен для упрощения обратимости операцийRunPythonиRunSQL.Операции миграции
RunPythonиRunSQLтеперь вызывают методallow_migrate()маршрутизаторов баз данных. Маршрутизатор может использовать недавно представленные аргументы app_label иhints для принятия решения о маршрутизации. Чтобы воспользоваться этой функцией, вам необходимо обновить маршрутизатор до новой подписи «allow_migrate», для получения более подробной информации см. раздел устаревания <deprecated-signature-of-allow-migrate>.
Модели¶
Django теперь регистрирует не более 9000 запросов в
connections.queries, чтобы предотвратить чрезмерное использование памяти в длительных процессах в режиме отладки.Теперь есть опция модели
Metaдля определениясвязанного имени по умолчаниюдля всех реляционных полей модели.Выбор моделей и наборов запросов в разных версиях Django официально не поддерживается (может работать, но нет гарантии). Дополнительная переменная, определяющая текущую версию Django, теперь добавляется в маринованное состояние моделей и наборов запросов, и Django выдает предупреждение RuntimeWarning, когда эти объекты распаковываются в версии, отличной от той, в которой они были маринованы.
Добавлен
Model.from_db(), который Django использует всякий раз, когда объекты загружаются с помощью ORM. Метод позволяет настроить поведение загрузки модели.extra(select={...})теперь позволяет вам экранировать буквальную последовательность%s, используя%%s.Пользовательские запросы теперь можно зарегистрировать с помощью шаблона декоратора.
Новый атрибут
Transform.bilateпозволяет создавать двусторонние преобразования. Эти преобразования применяются как к lhs, так и к rhs при использовании в выражении поиска, предоставляя возможности для более сложного поиска.Специальные символы SQL (, %, _) теперь корректно экранируются, когда поиск по шаблону (например,
contains,startswithи т. д.) используется с выражениемF()в правой части. В этих случаях экранирование выполняется базой данных, что может привести к довольно сложным запросам, включающим вызовы вложенных функций REPLACE.Теперь вы можете обновлять экземпляры модели, используя
Model.refresh_from_db().Теперь вы можете получить набор отложенных полей для модели, используя
Model.get_deferred_fields().Поле модели «по умолчанию» теперь используется, когда для поля первичного ключа установлено значение «Нет».
Сигналы¶
Исключения из кортежей
(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и запрос вызывает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¶
Предупреждение
В дополнение к изменениям, изложенным в этом разделе, обязательно просмотрите план прекращения поддержки на предмет всех удаленных функций. Если вы не обновили свой код в течение срока прекращения поддержки определенной функции, ее удаление может выглядеть как обратно несовместимое изменение.
Назначение несохраненных объектов отношениям вызывает ошибку¶
Примечание
To more easily allow in-memory usage of models, this change was reverted in
Django 1.8.4 and replaced with a check during model.save(). For example:
>>> 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.
Previously, the assignment of an unsaved object would be silently ignored. For example:
>>> book = Book.objects.create(name="Django")
>>> book.author = Author(name="John")
>>> book.author.save()
>>> book.save()
>>> Book.objects.get(name="Django")
>>> book.author
>>>
Now, an error will be raised to prevent data loss:
>>> 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, вы можете получить сообщение об ошибке типа Ошибка: нераспознанные аргументы: ..., поскольку синтаксический анализ переменных теперь основан на argparse, который неявно не принимает позиционные аргументы. Вы можете сделать свою команду обратно совместимой, просто установив переменную класса args. Однако, если вам не нужно поддерживать совместимость со старыми версиями Django, лучше реализовать новый метод add_arguments(), как описано в Writing custom django-admin commands.
Пользовательские аргументы команды управления тестированием с помощью средства запуска тестов¶
Изменился метод добавления пользовательских аргументов к команде управления «test» через средство запуска тестов. Раньше вы могли предоставить переменную класса option_list в программе запуска тестов, чтобы добавить больше аргументов (как в optparse). Теперь, чтобы реализовать то же поведение, вам нужно создать метод класса add_arguments(cls, parser) в средстве запуска тестов и вызвать parser.add_argument для добавления любых пользовательских аргументов, поскольку синтаксический анализатор теперь является экземпляром argparse.ArgumentParser.
Проверка модели гарантирует, что автоматически создаваемые имена столбцов находятся в пределах, установленных базой данных.¶
Имя поля, длина которого превышает длину имени столбца, поддерживаемого базой данных, может создать проблемы. Например, в MySQL вы получите исключение при попытке создать столбец, а в PostgreSQL имя столбца усекается базой данных (вы можете увидеть предупреждение в журналах PostgreSQL).
Была введена проверка модели, чтобы лучше предупреждать пользователей об этом сценарии до фактического создания таблиц базы данных.
Если у вас есть существующая модель, где эта проверка кажется ложноположительной, например, в PostgreSQL, где имя уже усекалось, просто используйте db_column, чтобы указать используемое имя.
Проверка также применяется к столбцам, созданным в неявной модели ManyToManyField.through. Если вы столкнулись с проблемой, используйте through, чтобы создать явную модель, а затем при необходимости укажите db_column для ее столбца(ов).
Поиск отношений запроса теперь проверяет типы объектов.¶
Querying for model lookups now checks if the object passed is of correct type
and raises a ValueError if not. Previously, Django didn’t care if the
object was of correct type; it just used the object’s related field attribute
(e.g. id) for the lookup. Now, an error is raised to prevent incorrect
lookups:
>>> 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 предоставили роли CONNECT и RESOURCE тестовому пользователю в Oracle. Эти роли устарели, поэтому 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 было перенесено в отдельный пакет, а соответствующие страницы документации были обновлены или удалены.
Новый пакет доступен на 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» присвоена цель связи, а не источник. Вместо этого исходная модель доступна по атрибуту linked_model.
Consider this example from the tutorial in 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'>
and compare it to the behavior on older versions:
>>> 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() теперь принимает параметр подзапроса (#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 были изменены, чтобы автоматически экранировать их входное значение:
присоединяйсяразрывы строкbrlinebreaks_filterномера строкнеупорядоченный_списокurlizeurlizetrnc
Вы можете вернуться к старому поведению, указав autoescape=False, если вы передаете доверенный контент. Это изменение не влияет на использование соответствующих фильтров в шаблонах.
Разнообразный¶
connections.queriesтеперь является атрибутом только для чтения.Соединения с базой данных считаются равными, только если они являются одним и тем же объектом. Они больше не подлежат хешированию.
GZipMiddlewareиспользуется для отключения сжатия для некоторых типов контента, когда запрос поступает из Internet Explorer, чтобы обойти ошибку в IE6 и более ранних версиях. Такое поведение может повлиять на производительность в IE7 и более поздних версиях. Оно было удалено.URLField.to_pythonбольше не добавляет косую черту в конце URL-адресов без путей.Фильтр шаблона
lengthтеперь возвращает0для неопределенной переменной, а не пустую строку.ForeignKey.default_error_message['invalid']изменен с'%(model)s экземпляр с pk %(pk)r не существует.'на'%(model)s экземпляр с %(field)s %(value)r не существует.'Если вы используете это сообщение в своем собственном коде, обновите список интерполируемых параметров. Внутри Django продолжит предоставлять параметр pk в params для обратной совместимости.UserCreationForm.error_messages['duulate_username']больше не используется. Если вы хотите настроить это сообщение об ошибке, переопределите его в форме, используя ключunique'вMeta.error_messages['username']или, если у вас есть настраиваемое поле формы для'username', используя'unique'ключ в егоerror_messagesаргумент.Блок
usertoolsв шаблонеbase.htmldjango.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 по умолчанию увеличен с 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. Раньше поля игнорировались.При следующих перенаправлениях тестовый клиент теперь выдает
RedirectCycleError, если он обнаруживает цикл или достигает максимального предела перенаправления (вместо того, чтобы проходить молча).Переводимые строки, установленные в качестве параметра поля
default, позже преобразуются в конкретные строки, поэтому тип возвращаемого значенияField.get_default()в некоторых случаях отличается. Значения по умолчанию, являющиеся результатом вызываемого объекта, не изменяются.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.pymigrate --fake, эта миграция будет пропущена, и вы увидите исключениеRuntimeError: Ошибка создания новых типов контента., поскольку столбецnameне будет удален из базы данных. Вместо этого используйтеmanage.pymigrate --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_lated_many_to_many_objects()get_all_lated_m2m_objects_with_model()get_concrete_fields_with_model()get_field_by_name()get_fields_with_model()get_m2m_with_model()
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 могут помочь с автодополнением имен представления и т. д.
Таким образом, в наши дни приведенное выше использование префикса arg с гораздо большей вероятностью будет записано (и лучше записано) как:
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заменен нааннотации.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. Этот кэшированный набор запросов между несколькими визуализациями одного и того же объекта «Форма». Эта опция подлежит ускоренному прекращению поддержки и будет удалена в Django 1.9.
django.template.resolve_variable()¶
В течение некоторого времени функция была неофициально помечена как «Устаревшая». Замените resolve_variable(path, context) на django.template.Variable(path).resolve(context).
django.contrib.webdesign¶
Он предоставил тег шаблона lorem, который теперь включен во встроенные теги. Просто удалите 'django.contrib.webdesign' из :setting: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.
Аргумент is_admin_site для django.contrib.auth.views.password_reset()¶
Это устаревший вариант, который больше не нужен.
База Подполя¶
django.db.models.fields.subclassing.SubfieldBase устарел и будет удален в Django 1.10. Исторически он использовался для обработки полей, где при загрузке из базы данных требовалось преобразование типов, но не использовался в вызовах .values() или в агрегатах. Он был заменен на from_db_value().
Новый подход не вызывает метод to_python() при назначении, как это было в случае с SubfieldBase``. Если вам нужно такое поведение, переопределите класс Creator из исходного кода Django <https://github.com/django/django/blob/stable/1.8.x/django/db/models/fields/subclassing.py#L31-L44>`_ в своем проекте.
django.utils.checksums¶
The django.utils.checksums module has been deprecated and will be removed
in Django 1.10. The functionality it provided (validating checksum using the
Luhn algorithm) was undocumented and not used in Django. The module has been
moved to the django-localflavor package (version 1.1+).
InlineAdminForm.original_content_type_id¶
Атрибут original_content_type_id в InlineAdminForm устарел и будет удален в Django 1.10. Исторически он использовался для создания URL-адреса «просмотра на сайте». Этот URL-адрес теперь доступен с помощью атрибута формы absolute_url.
Аргумент form_class django.views.generic.edit.FormMixin.get_form()¶
Подклассы 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 и объекты шаблонов, зависящие от серверной части соответственно.
Это также относится к типам возвращаемых значений, если вы создали подкласс любого класса ответа шаблона.
Дополнительную информацию можно найти в документации 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. Когда словарь передается в качестве позиционного аргумента (это наиболее распространенная идиома), никаких изменений не требуется.
Если вы передаете Context в context_instance, вместо этого передайте dict в параметре context. Если вы передаете RequestContext, передайте запрос отдельно в параметре request.
dirs аргумент функций поиска шаблонов¶
Следующие функции больше не будут принимать параметр dirs для переопределения TEMPLATE_DIRS в Django 1.10:
django.shortcuts.render_to_response()
Этот параметр не работал одинаково в разных загрузчиках шаблонов и не работал для включенных шаблонов.
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 заменен на компилятор¶
В предыдущих версиях 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(), extent(), make_line() и unionag() устарели и должны быть заменены их агрегатными эквивалентами на основе функций (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.backenddjango.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удалены.