Примечания к выпуску Django 1.8¶
1 апреля 2015
Добро пожаловать в Django 1.8!
Эти заметки о выпуске охватывают new features, а также некоторые backwards incompatible changes, о которых вы должны знать при переходе с Django 1.7 или более старых версий. Мы также begun the deprecation process for some features, а некоторые функции достигли конца своего процесса устаревания и have been removed.
См. руководство Как обновить Django до более новой версии, если вы обновляете существующий проект.
Django 1.8 был определен как второй long-term support release. Он будет получать обновления безопасности в течение как минимум трех лет после выпуска. Поддержка предыдущей LTS, Django 1.4, закончится через 6 месяцев после выхода Django 1.8.
Совместимость с Python¶
Django 1.8 требует Python 2.7, 3.2, 3.3, 3.4 или 3.5. Мы настоятельно рекомендуем и официально поддерживаем только последний выпуск каждой серии.
Django 1.8 - это первый релиз, поддерживающий Python 3.5.
В связи с прекращением поддержки Python 3.2 в феврале 2016 года, мы не будем тестировать Django 1.8.x на Python 3.2 после конца 2016 года.
Что нового в Django 1.8¶
Model._meta API¶
Django теперь имеет формализованный API для Model._meta, предоставляя официально поддерживаемый способ retrieve fields и фильтрации полей на основе их attributes.
Объект Model._meta был частью Django со времен до версии 0.96 «Magic Removal» - он просто не был официальным, стабильным API. Признавая это, мы постарались сохранить обратную совместимость со старой конечной точкой API, где это возможно. Однако конечные точки API, которые не являются частью нового официального API, были устаревшими и со временем будут удалены.
Несколько шаблонизаторов¶
Django 1.8 определяет стабильный API для интеграции бэкендов шаблонов. Он включает встроенную поддержку языка шаблонов Django и Jinja2. Он поддерживает рендеринг шаблонов с несколькими движками в рамках одного проекта. Узнайте больше о новых возможностях в topic guide и ознакомьтесь с инструкциями по обновлению в старых версиях документации.
Усовершенствования в области безопасности¶
Некоторые возможности сторонней библиотеки django-secure были интегрированы в Django. django.middleware.security.SecurityMiddleware обеспечивает несколько улучшений безопасности цикла запрос/ответ. Новая опция check --deploy позволяет вам проверить файл настроек вашего продакшена на предмет способов повышения безопасности вашего сайта.
Новая функциональность, специфичная для PostgreSQL¶
В Django появился модуль с расширениями для специфических возможностей PostgreSQL, таких как ArrayField, HStoreField, Поля диапазона и unaccent lookup. Полное описание возможностей доступно in the documentation.
Новые типы данных¶
- В Django теперь есть
UUIDFieldдля хранения универсально уникальных идентификаторов. Он хранится как собственный тип данныхuuidв PostgreSQL и как символьное поле фиксированной длины в других бэкендах. Существует соответствующийform field. - В Django теперь есть
DurationFieldдля хранения периодов времени - в Python это моделируетсяtimedelta. Он хранится в собственном типе данныхintervalв PostgreSQL, какINTERVAL DAY(9) TO SECOND(6)в Oracle, и какbigintмикросекунд в других бэкендах. Арифметика, связанная с датой и временем, также была улучшена на всех бэкендах. Имеется соответствующее значениеform field.
Выражения запросов, условные выражения и функции базы данных¶
Query Expressions позволяют создавать, настраивать и составлять сложные SQL-выражения. Это позволило annotate принимать выражения, отличные от агрегатов. Агрегаты теперь могут ссылаться на несколько полей, а также выполнять арифметические действия, аналогично объектам F(). order_by() также получил возможность принимать выражения.
Conditional Expressions позволяют использовать if … elif … else логику в запросах.
Коллекция database functions также включена с такими функциональными возможностями, как Coalesce, Concat и Substr.
TestCase установка данных¶
TestCase был рефакторингован, чтобы позволить инициализацию данных на уровне класса с использованием транзакций и точек сохранения. Бэкенды баз данных, не поддерживающие транзакции, такие как MySQL с механизмом хранения MyISAM, по-прежнему смогут выполнять эти тесты, но не получат преимуществ от улучшений. Тесты теперь выполняются в двух вложенных блоках atomic(): один для всего класса и один для каждого теста.
- Метод класса
TestCase.setUpTestData()добавляет возможность устанавливать тестовые данные на уровне класса. Использование этой техники может ускорить выполнение тестов по сравнению с использованиемsetUp(). - Загрузка приспособления в пределах
TestCaseтеперь выполняется один раз для всегоTestCase.
Незначительные особенности¶
django.contrib.admin¶
ModelAdminтеперь имеет методhas_module_permission(), позволяющий ограничить доступ к модулю на индексной странице администратора.InlineModelAdminтеперь имеет атрибутshow_change_link, который поддерживает показ ссылки на форму изменения инлайн-объекта.- Используйте новый
django.contrib.admin.RelatedOnlyFieldListFilterвModelAdmin.list_filter, чтобы ограничить выборlist_filterпосторонними объектами, которые прикреплены к объектам изModelAdmin. ModelAdmin.delete_view()отображает сводку удаляемых объектов на странице подтверждения удаления.- Библиотека jQuery, встроенная в админку, была обновлена до версии 1.11.2.
- Теперь вы можете указать
AdminSite.site_urlдля отображения ссылки на внешний сайт. - Теперь вы можете указать
ModelAdmin.show_full_result_count, чтобы контролировать отображение полного количества объектов на отфильтрованной странице администратора. - Метод
AdminSite.password_change()теперь имеет параметрextra_context. - Теперь вы можете контролировать, кто может войти на сайт администратора, переопределив только
AdminSite.has_permission()иAdminSite.login_form. Шаблонbase.htmlимеет новый блокusertools, который содержит заголовок, специфичный для пользователя. Новая контекстная переменнаяhas_permission, которая получает свое значение изhas_permission(), указывает, может ли пользователь получить доступ к сайту. - В выпадающих списках внешних ключей теперь есть кнопки для изменения или удаления связанных объектов с помощью всплывающего окна.
django.contrib.admindocs¶
- reStructuredText теперь разбирается в документах модели.
django.contrib.auth¶
- Бэкенды авторизации теперь могут поднимать
PermissionDeniedвhas_perm()иhas_module_perms()для обхода проверки разрешений. PasswordResetFormтеперь имеет методsend_mail(), который может быть переопределен для настройки отправляемой почты.- Размер
max_lengthизPermission.nameбыл увеличен с 50 до 255 символов. Пожалуйста, запустите миграцию базы данных. USERNAME_FIELDиREQUIRED_FIELDSтеперь поддерживаютForeignKeys.- Количество итераций по умолчанию для хешера паролей PBKDF2 было увеличено на 33%. Это обратно совместимое изменение не повлияет на пользователей, которые подклассифицировали
django.contrib.auth.hashers.PBKDF2PasswordHasherдля изменения значения по умолчанию.
django.contrib.gis¶
- Теперь доступен новый GeoJSON serializer.
- Теперь разрешено включать подзапрос в качестве аргумента географического поиска, например
City.objects.filter(point__within=Country.objects.filter(continent='Africa').values('mpoly')). - Бэкэнд SpatiaLite теперь поддерживает агрегаты
CollectиExtent, если версия базы данных 3.0 или более поздняя. - Команды инициализации PostGIS 2
CREATE EXTENSION postgisи SpatiaLiteSELECT InitSpatialMetaDataтеперь автоматически запускаютсяmigrate. - Интерфейс GDAL теперь поддерживает получение свойств raster (image) data file.
- Удалены шиммы совместимости для
SpatialRefSysиGeometryColumns, измененные в Django 1.2. - Все исключения, связанные с GDAL, теперь вызываются с помощью
GDALException. ПрежнееOGRExceptionбыло сохранено для обратной совместимости, но больше не должно использоваться.
django.contrib.sessions¶
- Куки сессии теперь удаляются после вызова
flush().
django.contrib.sitemaps¶
- Новый атрибут
Sitemap.i18nпозволяет генерировать карту сайта на основе настройкиLANGUAGES.
django.contrib.sites¶
get_current_site()теперь будет искать текущий сайт на основеrequest.get_host(), если параметрSITE_IDне определен.- Умолчание
Site, создаваемое при выполненииmigrate, теперь учитывает установкуSITE_ID(вместо того, чтобы всегда использоватьpk=1).
Кэш¶
- Метод
incr()бэкендаdjango.core.cache.backends.locmem.LocMemCacheтеперь потокобезопасен.
Криптография¶
- Параметр
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 database notes. - Бэкэнд MySQL больше не создает явные индексы для внешних ключей при использовании механизма хранения InnoDB, поскольку MySQL уже создает их автоматически.
- Бэкэнд Oracle больше не определяет функцию
connection_persists_old_columnsкакTrue. Вместо этого Oracle теперь будет включать условие разрушения кэша при получении описания таблицы.
Електронна пошта¶
- Email backends теперь поддерживает протокол контекстного менеджера для открытия и закрытия соединений.
- Бэкенд электронной почты SMTP теперь поддерживает аутентификацию
keyfileиcertfileс настройкамиEMAIL_SSL_CERTFILEиEMAIL_SSL_KEYFILE. - SMTP
EmailBackendтеперь поддерживает установку параметраtimeoutс помощью параметраEMAIL_TIMEOUT. EmailMessageиEmailMultiAlternativesтеперь поддерживают параметрreply_to.
Хранение файлов¶
Storage.get_available_name()иStorage.save()теперь принимают аргументmax_lengthдля реализации ограничений максимальной длины имени файла на уровне хранилища. Имена файлов, превышающие этот аргумент, будут усекаться. Это предотвращает ошибку базы данных при добавлении уникального суффикса к длинному имени файла, который уже существует в хранилище. См. deprecation note о добавлении этого аргумента в пользовательские классы хранилищ.
Формы¶
- Виджеты форм теперь отображают атрибуты со значением
TrueилиFalseкак булевые атрибуты HTML5. - Новый метод
has_error()позволяет проверить, произошла ли конкретная ошибка. - Если на форме определено
required_css_class, то теги<label>для обязательных полей будут иметь этот класс в своих атрибутах. - Отображение ошибок, не относящихся к полю, в неупорядоченных списках (
<ul>) теперь включаетnonfieldв список классов, чтобы отличать их от ошибок, относящихся к полю. Fieldтеперь принимает аргументlabel_suffix, который будет переопределятьlabel_suffixформы. Это позволяет настраивать суффикс для каждого поля - ранее было невозможно переопределить суффикс формыlabel_suffixпри использовании в шаблонах таких ярлыков, как{{ form.as_p }}.SelectDateWidgetтеперь принимает аргументempty_label, который будет переопределять метку выбора верхнего списка, когдаDateFieldне требуется.- После очистки и проверки
ImageFieldобъектUploadedFileбудет иметь дополнительный атрибутimage, содержащий экземпляр PillowImage, используемый для проверки того, является ли файл действительным изображением. Он также обновитUploadedFile.content_typeс типом содержимого изображения, определенным Pillow. - Теперь при инстанцировании
ChoiceFieldможно передавать вызываемую переменную, которая возвращает итерабельную выборку.
Общие представления¶
- Общие представления, использующие
MultipleObjectMixin, теперь могут указывать порядок, применяемый кqueryset, задаваяorderingили переопределяяget_ordering(). - Новый атрибут
SingleObjectMixin.query_pk_and_slugпозволяет изменить поведениеget_object()так, чтобы он выполнял поиск, используя как первичный ключ, так и slug. - Метод
get_form()больше не требует указанияform_class. Еслиform_classне предоставлен, по умолчанию используетсяget_form_class(). - Местоимения в
ModelFormMixin.success_urlтеперь поддерживают синтаксис Pythonstr.format(). Устаревший синтаксис%(<foo>)sвсе еще поддерживается, но будет удален в Django 1.10.
Интернационализация¶
FORMAT_MODULE_PATHтеперь может быть списком строк, представляющих пути к модулям. Это позволяет импортировать несколько модулей форматов из различных многократно используемых приложений. Это также позволяет переопределять эти пользовательские форматы в вашем основном проекте Django.
Ведение журнала¶
- Класс
django.utils.log.AdminEmailHandlerтеперь имеет методsend_mail(), чтобы сделать его более дружественным к подклассам.
Команды управления¶
- Соединения с базой данных теперь всегда закрываются после того, как команда управления, вызванная из командной строки, выполнила свою работу.
- Команды из альтернативных форматов пакетов, таких как eggs, теперь также обнаруживаются.
- Новая опция
dumpdata --outputпозволяет указать файл, в который записываются сериализованные данные. - Новые опции
makemessages --excludeиcompilemessages --excludeпозволяют исключить из обработки определенные локали. compilemessagesтеперь имеет опцию--use-fuzzyили-f, которая включает нечеткие переводы в скомпилированные файлы.- Опция
loaddata --ignorenonexistentтеперь игнорирует данные для моделей, которые больше не существуют. runserverтеперь использует потоки демонов для более быстрой перезагрузки.inspectdbтеперь выводитMeta.unique_together. Он также способен интроспектироватьAutoFieldдля баз данных MySQL и PostgreSQL.- При вызове команд управления с опциями с помощью
call_command()имя опции может соответствовать имени опции командной строки (без начальных тире) или имени конечной переменной назначения опции, но в любом случае результирующей опцией, получаемой командой, теперь всегда является имяdest, указанное в определении опции команды (если команда использует модульargparse). - Команда
dbshellтеперь поддерживает дополнительную настройку центра сертификации SSL в MySQL (--ssl-ca). - Новый
makemigrations --nameпозволяет дать миграции пользовательское имя вместо сгенерированного. - Команда
loaddataтеперь предотвращает повторную загрузку приспособления. ЕслиFIXTURE_DIRSсодержит дубликаты или путь к каталогу приспособлений по умолчанию (app_name/fixtures), возникает исключение. - Новая опция
makemigrations --exitпозволяет завершить работу с кодом ошибки, если миграции не созданы. - Новая команда
showmigrationsпозволяет перечислить все миграции и их зависимости в проекте.
Middleware¶
- Атрибут
CommonMiddleware.response_redirect_classпозволяет вам настраивать перенаправления, выдаваемые промежуточным ПО. - Отладочное сообщение будет записываться в журнал
django.request, когда промежуточное ПО вызывает исключениеMiddlewareNotUsedв режимеDEBUG.
Миграции¶
- Операция
RunSQLтеперь может обрабатывать параметры, передаваемые в операторы SQL. - Теперь возможно иметь миграции (скорее всего data migrations) для приложений без моделей.
- Миграции теперь могут serialize model managers как часть состояния модели.
- Было добавлено generic mechanism to handle the deprecation of model fields.
- Метод/атрибут класса
RunPython.noop()иRunSQL.noopбыли добавлены для облегчения выполнения обратимых операцийRunPythonиRunSQL. - Операции миграции
RunPythonиRunSQLтеперь вызывают методallow_migrate()маршрутизаторов баз данных. Маршрутизатор может использовать вновь введенные аргументыapp_labelиhintsдля принятия решения о маршрутизации. Чтобы воспользоваться этой возможностью, необходимо обновить маршрутизатор до новой сигнатурыallow_migrate, подробнее см. в deprecation section.
Модели¶
- Django теперь регистрирует не более 9000 запросов в
connections.queries, чтобы предотвратить чрезмерное использование памяти в длительно работающих процессах в режиме отладки. - Теперь существует опция модели
Metaдля определенияdefault related nameдля всех реляционных полей модели. - Распаковка моделей и наборов запросов в разных версиях Django официально не поддерживается (это может работать, но нет гарантии). Дополнительная переменная, указывающая текущую версию Django, теперь добавляется к состоянию маринованных моделей и наборов запросов, и Django выдает ошибку
RuntimeWarning, когда эти объекты распаковываются в версии, отличной от той, в которой они были распакованы. - Добавлен
Model.from_db(), который Django использует всякий раз, когда объекты загружаются с помощью ORM. Метод позволяет настраивать поведение загрузки модели. extra(select={...})теперь позволяет экранировать литеральную последовательность%sс помощью%%s.- Custom Lookups теперь можно зарегистрировать с помощью шаблона декоратора.
- Новый атрибут
Transform.bilateralпозволяет создавать двусторонние преобразования. Эти преобразования применяются как кlhs, так и кrhsпри использовании в выражении поиска, предоставляя возможности для более сложного поиска. - Специальные символы SQL (, %, _) теперь экранируются правильно, когда поиск по шаблону (например,
contains,startswithи т.д.) используется с выражениемF()в качестве правой части. В этих случаях экранирование выполняется базой данных, что может привести к несколько сложным запросам, включающим вложенные вызовы функцийREPLACE. - Теперь вы можете обновлять экземпляры модели с помощью
Model.refresh_from_db(). - Теперь вы можете получить набор отложенных полей для модели, используя
Model.get_deferred_fields(). - Поле модели
defaultтеперь используется, когда для поля первичного ключа установлено значениеNone.
Сигналы¶
- Исключения из кортежей
(receiver, exception), возвращаемыхSignal.send_robust(), теперь имеют трассировку возврата в виде атрибута__traceback__. - Аргумент
environ, который содержит структуру окружения WSGI из запроса, был добавлен к сигналуrequest_started. - Теперь вы можете импортировать сигнал
setting_changed()изdjango.core.signals, чтобы избежать загрузкиdjango.testв нетестовых ситуациях. Django больше не делает этого сам.
Шаблоны¶
urlizeтеперь поддерживает ссылки только на домен, которые включают символы после домена верхнего уровня (например,djangoproject.com/иdjangoproject.com/download/).urlizeне рассматривает восклицательные знаки в конце домена или строки запроса как часть URL (URL, например,'djangoproject.com!- этоdjangoproject.com).- Добавлен класс
locmem.Loader, который загружает шаблоны Django из словаря Python. - Тег
nowтеперь может хранить свой вывод в контекстной переменной с обычным синтаксисом:{% now 'j n Y' as varname %}.
Запросы и ответы¶
WSGIRequestтеперь уважает пути, начинающиеся с//.- Метод
HttpRequest.build_absolute_uri()теперь корректно обрабатывает пути, начинающиеся с//. - Если
DEBUGимеет значениеTrueи запрос вызываетSuspiciousOperation, то в ответ будет выдана подробная страница ошибки. - Аргумент
query_stringвQueryDictтеперь необязателен, по умолчанию он равенNone, поэтому пустойQueryDictтеперь можно инстанцировать с помощьюQueryDict()вместоQueryDict(None)илиQueryDict(''). - Атрибуты
GETиPOSTобъектаHttpRequestтеперь являютсяQueryDicts, а не словарями, а атрибутFILESтеперь являетсяMultiValueDict. Это приводит данный класс в соответствие с документацией и сWSGIRequest. - Был добавлен атрибут
HttpResponse.charset. WSGIRequestHandlerтеперь следует RFC при преобразовании URI в IRI, используяuri_to_iri().- Метод
HttpRequest.get_full_path()теперь правильно экранирует небезопасные символы из части пути унифицированного идентификатора ресурса (URI). HttpResponseтеперь реализует несколько дополнительных методов, какgetvalue(), чтобы экземпляры можно было использовать как объекты потока.- Новый метод
HttpResponse.setdefault()позволяет установить заголовок, если он еще не был установлен. - Вы можете использовать новый
FileResponseдля потоковой передачи файлов. - Декоратор
condition()для условной обработки представления теперь поддерживает заголовокIf-unmodified-since.
Тесты¶
- Были реализованы методы
RequestFactory.trace()иClient.trace(), позволяющие создаватьTRACEзапросы в ваших тестах. - Аргумент
countбыл добавлен кassertTemplateUsed(). Это позволяет утверждать, что шаблон был отрисован определенное количество раз. - Новое утверждение
assertJSONNotEqual()позволяет проверить, что два фрагмента JSON не равны. - В команду
testдобавлены опции для сохранения базы данных тестов (--keepdb), запуска тестовых примеров в обратном порядке (--reverse) и включения регистрации SQL для неудачных тестов (--debug-sql). - Добавлен атрибут
resolver_matchдля тестирования ответов клиента. - Добавлено несколько настроек, позволяющих настраивать параметры тестового табличного пространства для Oracle:
DATAFILE,DATAFILE_TMP,DATAFILE_MAXSIZEиDATAFILE_TMP_MAXSIZE. - Декоратор
override_settings()теперь может влиять на главный маршрутизатор вDATABASE_ROUTERS. - Добавлена поддержка тестового клиента для загрузки файлов с файлоподобными объектами.
- При тестировании с базой данных SQLite in-memory при использовании Python 3.4+ и SQLite 3.7.13+ теперь используется общий кэш. Это позволяет разделять базу данных между потоками.
Валидаторы¶
URLValidatorтеперь поддерживает адреса IPv6, домены Unicode и URL, содержащие данные аутентификации.
Изменения в 1.8, несовместимые с обратными изменениями¶
Предупреждение
В дополнение к изменениям, описанным в этом разделе, обязательно просмотрите deprecation plan для любых функций, которые были удалены. Если вы не обновили свой код в течение срока устаревания данной функции, ее удаление может выглядеть как изменение, несовместимое с обратным развитием событий.
Присвоение несохраненных объектов отношениям приводит к ошибке¶
Примечание
Чтобы легче было разрешить использование моделей в памяти, это изменение было отменено в Django 1.8.4 и заменено проверкой при model.save(). Например:
>>> book = Book.objects.create(name="Django")
>>> book.author = Author(name="John")
>>> book.save()
Traceback (most recent call last):
...
ValueError: save() prohibited to prevent data loss due to unsaved related object 'author'.
В Django 1.8.5 была удалена аналогичная проверка присваивания для обратных отношений один-к-одному.
Назначение несохраненных объектов на ForeignKey, GenericForeignKey и OneToOneField теперь вызывает ошибку ValueError.
Ранее назначение несохраненного объекта молча игнорировалось. Например:
>>> book = Book.objects.create(name="Django")
>>> book.author = Author(name="John")
>>> book.author.save()
>>> book.save()
>>> Book.objects.get(name="Django")
>>> book.author
>>>
Теперь для предотвращения потери данных будет выдаваться ошибка:
>>> book.author = Author(name="john")
Traceback (most recent call last):
...
ValueError: Cannot assign "<Author: John>": "Author" instance isn't saved in the database.
Если вам необходимо разрешить присвоение несохраненных экземпляров (старое поведение) и вас не беспокоит возможность потери данных (например, вы никогда не сохраняете объекты в базе данных), вы можете отключить эту проверку с помощью атрибута ForeignKey.allow_unsaved_instance_assignment. (Этот атрибут был удален в версии 1.8.4, поскольку он больше не актуален).
Команды управления, которые принимают только позиционные аргументы¶
Если вы написали пользовательскую команду управления, которая принимает только позиционные аргументы, и не указали командную переменную args, вы можете получить ошибку типа Error: unrecognized arguments: ..., поскольку разбор переменных теперь основан на argparse, который неявно не принимает позиционные аргументы. Вы можете сделать свою команду обратно совместимой, просто установив переменную класса args. Однако, если вам не нужно сохранять совместимость со старыми версиями Django, лучше реализовать новый метод add_arguments(), как описано в Как создавать пользовательские команды django-admin.
Пользовательские аргументы команд управления тестами через программу запуска тестов¶
Метод добавления пользовательских аргументов к команде управления test через бегунок тестирования изменился. Раньше для добавления дополнительных аргументов можно было использовать переменную класса option_list в тестовом бегуне (а-ля optparse). Теперь для реализации того же поведения необходимо создать метод класса add_arguments(cls, parser) в тестовом бегуне и вызвать parser.add_argument для добавления любых пользовательских аргументов, поскольку парсер теперь является экземпляром argparse.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¶
В июле 2014 года закончился срок поддержки PostgreSQL 8.4. Как следствие, Django 1.8 устанавливает 9.0 в качестве минимальной версии PostgreSQL, которую он официально поддерживает.
Это также включает отказ от поддержки PostGIS 1.3 и 1.4, поскольку эти версии не поддерживаются на версиях PostgreSQL позже 8.4.
Django также теперь требует использования Psycopg2 версии 2.4.5 или выше (или 2.5+, если вы хотите использовать django.contrib.postgres).
Поддержка версий MySQL старше 5.5¶
Окончание срока поддержки было достигнуто в январе 2012 года для MySQL 5.0 и в декабре 2013 года для MySQL 5.1. Как следствие, Django 1.8 устанавливает 5.5 в качестве минимальной версии MySQL, которую он официально поддерживает.
Поддержка версий Oracle старше 11.1¶
Окончание периода поддержки было достигнуто в июле 2010 года для Oracle 9.2, в январе 2012 года для Oracle 10.1 и в июле 2013 года для Oracle 10.2. Как следствие, Django 1.8 устанавливает 11.1 в качестве минимальной версии Oracle, которую он официально поддерживает.
Использование специфических привилегий вместо ролей для тестов на Oracle¶
В предыдущих версиях Django тестовому пользователю на Oracle предоставлялись роли CONNECT и RESOURCE. Эти роли были устаревшими, поэтому Django 1.8 вместо них использует конкретные базовые привилегии. Это изменяет привилегии, требуемые от основного пользователя для запуска тестов (если только проект не настроен так, чтобы не создавать тестового пользователя). Точные привилегии, требуемые сейчас, подробно описаны в Oracle notes.
AbstractUser.last_login допускает нулевые значения¶
Поле AbstractUser.last_login теперь допускает нулевые значения. Ранее оно по умолчанию указывало время, когда пользователь был создан, что вводило в заблуждение, если пользователь никогда не входил в систему. Если вы используете пользователя по умолчанию (django.contrib.auth.models.User), запустите миграцию базы данных, включенную в contrib.auth.
Если вы используете пользовательскую модель пользователя, которая наследуется от AbstractUser, вам нужно будет выполнить makemigrations и сгенерировать миграцию для вашего приложения, содержащего эту модель. Также, если вы хотите установить last_login в NULL для пользователей, которые не вошли в систему, вы можете выполнить следующий запрос:
from django.db import models
from django.contrib.auth import get_user_model
from django.contrib.auth.models import AbstractBaseUser
UserModel = get_user_model()
if issubclass(UserModel, AbstractBaseUser):
UserModel._default_manager.filter(
last_login=models.F('date_joined')
).update(last_login=None)
django.contrib.gis¶
- Поддержка GEOS 3.1 и GDAL 1.6 была прекращена.
- Поддержка SpatiaLite < 2.4 была прекращена.
- Поиск, специфичный для ГИС, был переработан для использования API
django.db.models.Lookup. - Представление по умолчанию
strобъектовGEOSGeometryбыло изменено с формата WKT на формат EWKT (включая SRID). Поскольку это представление используется во фреймворке сериализации, это означает, что выводdumpdataтеперь будет содержать значение SRID геометрических объектов.
Приоритет контекстных процессоров для TemplateResponse приведен в соответствие с render¶
Конструктор TemplateResponse был разработан как замена функции render(). Однако в нем была небольшая несовместимость, заключавшаяся в том, что для TemplateResponse контекстные данные из переданного контекстного словаря могли быть затенены контекстными данными, возвращаемыми контекстными процессорами, в то время как для render все было наоборот. Это была ошибка, и поведение render является более подходящим, поскольку позволяет переопределять глобально определенные контекстные процессоры локально в представлении. Если вы полагались на то, что контекстные данные в TemplateResponse могут быть переопределены с помощью контекстного процессора, вам придется изменить свой код.
Переопределение setUpClass / tearDownClass в тестовых случаях¶
Декораторы override_settings() и modify_settings() теперь действуют на уровне класса, когда используются в качестве декораторов класса. Как следствие, при переопределении setUpClass() или tearDownClass() всегда следует вызывать реализацию super.
Удаление django.contrib.formtools¶
Приложение formtools contrib было перенесено в отдельный пакет, а соответствующие страницы документации были обновлены или удалены.
Новый пакет доступен on GitHub и на PyPI.
Перезагрузка соединения с базой данных между тестами¶
Раньше Django закрывал соединения с базой данных между каждым тестом в рамках TestCase. Теперь это не так, поскольку Django теперь оборачивает весь TestCase внутри транзакции. Если некоторые из ваших тестов полагаются на старое поведение, вам следует унаследовать их от TransactionTestCase.
Очистка пространства имен django.template¶
Если вы полагались на частные API, открытые в модуле django.template, вам, возможно, придется импортировать их из django.template.base вместо этого.
Также были удалены приватные API django.template.base.compile_string(), django.template.loader.find_template() и django.template.loader.get_template_from_string().
model атрибут на частных отношениях модели¶
В ранних версиях Django в модели с обратной связью по внешнему ключу (например) метод model._meta.get_all_related_objects() возвращал связь как django.db.models.related.RelatedObject с атрибутом model, установленным на источник связи. Теперь этот метод возвращает отношение как django.db.models.fields.related.ManyToOneRel (частный API RelatedObject был удален), а атрибут model устанавливается на цель отношения вместо источника. Модель источника доступна по атрибуту related_model вместо этого.
Рассмотрим этот пример из учебника по Django 1.8:
>>> p = Poll.objects.get(pk=1)
>>> p._meta.get_all_related_objects()
[<ManyToOneRel: polls.choice>]
>>> p._meta.get_all_related_objects()[0].model
<class 'polls.models.Poll'>
>>> p._meta.get_all_related_objects()[0].related_model
<class 'polls.models.Choice'>
и сравните его с поведением на более старых версиях:
>>> p._meta.get_all_related_objects()
[<RelatedObject: polls:choice related to poll>]
>>> p._meta.get_all_related_objects()[0].model
<class 'polls.models.Choice'>
Для доступа к исходной модели вы можете использовать паттерн, подобный этому, чтобы написать код, который будет работать как с Django 1.8, так и с более старыми версиями:
for relation in opts.get_all_related_objects():
to_model = getattr(relation, 'related_model', relation.model)
Также обратите внимание, что get_all_related_objects() устарел в версии 1.8.
API бэкенда базы данных¶
Следующие изменения в API бэкенда базы данных документированы, чтобы помочь тем, кто пишет сторонние бэкенды, обновить свой код:
Классы
BaseDatabaseXXXбыли перемещены вdjango.db.backends.base. Пожалуйста, импортируйте их из новых мест:from django.db.backends.base.base import BaseDatabaseWrapper from django.db.backends.base.client import BaseDatabaseClient from django.db.backends.base.creation import BaseDatabaseCreation from django.db.backends.base.features import BaseDatabaseFeatures from django.db.backends.base.introspection import BaseDatabaseIntrospection from django.db.backends.base.introspection import FieldInfo, TableInfo from django.db.backends.base.operations import BaseDatabaseOperations from django.db.backends.base.schema import BaseDatabaseSchemaEditor from django.db.backends.base.validation import BaseDatabaseValidation
Атрибуты
data_types,data_types_suffixиdata_type_check_constraintsперешли из классаDatabaseCreationвDatabaseWrapper.Метод
SQLCompiler.as_sql()теперь принимает параметрsubquery(#24164).Метод
BaseDatabaseOperations.date_interval_sql()теперь принимает только параметрtimedelta.
django.contrib.admin¶
AdminSiteбольше не принимает аргументapp_nameи его атрибутapp_nameбыл удален. Имя приложения всегдаadmin(в отличие от имени экземпляра, которое все еще можно настроить с помощьюAdminSite(name="...").- Метод
ModelAdmin.get_object()(частный API) теперь принимает третий аргументfrom_field, чтобы указать, какое поле должно соответствовать предоставленномуobject_id. - Метод
ModelAdmin.response_delete()теперь принимает второй аргументobj_id, который является сериализованным идентификатором, используемым для получения объекта перед удалением.
Автоперевод функций в django.template.defaultfilters по умолчанию¶
Чтобы сделать встроенные фильтры шаблонов, выводящие HTML, «безопасными по умолчанию» при вызове их в коде Python, следующие функции в django.template.defaultfilters были изменены так, чтобы автоматически экранировать их входное значение:
joinlinebreaksbrlinebreaks_filterlinenumbersunordered_listurlizeurlizetrunc
Вы можете вернуться к старому поведению, указав autoescape=False, если вы передаете доверенное содержимое. Это изменение не влияет на использование соответствующих фильтров в шаблонах.
Разное¶
connections.queriesтеперь является атрибутом только для чтения.Соединения базы данных считаются одинаковыми, только если они являются одним и тем же объектом. Они больше не являются хэшируемыми.
GZipMiddlewareиспользуется для отключения сжатия для некоторых типов контента при запросе из Internet Explorer, чтобы обойти ошибку в IE6 и более ранних версиях. Такое поведение могло повлиять на производительность в IE7 и более поздних версиях. Оно было удалено.URLField.to_pythonбольше не добавляет косую черту в URL без пути.Фильтр шаблона
lengthтеперь возвращает0для неопределенной переменной, а не пустую строку.ForeignKey.default_error_message['invalid']был изменен с'%(model)s instance with pk %(pk)r does not exist.'на'%(model)s instance with %(field)s %(value)r does not exist.'Если вы используете это сообщение в своем собственном коде, пожалуйста, обновите список интерполируемых параметров. Внутри Django будет продолжать предоставлять параметрpkвparamsдля обратной совместимости.UserCreationForm.error_messages['duplicate_username']больше не используется. Если вы хотите настроить это сообщение об ошибке, override it on the form используйте ключ'unique'вMeta.error_messages['username']или, если у вас есть пользовательское поле формы для'username', используйте ключ'unique'в его аргументеerror_messages.Блок
usertoolsв шаблонеbase.htmlшаблонаdjango.contrib.adminтеперь требует установки контекстной переменнойhas_permission. Если у вас есть пользовательские представления администратора, использующие этот шаблон, обновите их, чтобы передатьAdminSite.has_permission()в качестве значения этой новой переменной или просто включитеAdminSite.each_context(request)в контекст.В виджете
ClearableFileInputбыли сделаны внутренние изменения, чтобы обеспечить более широкую настройку. Недокументированный атрибутurl_markup_templateбыл удален в пользуtemplate_with_initial.Для согласованности с другими крупными производителями, локаль
en_GBтеперь имеет понедельник в качестве первого дня недели.Секунды были удалены из всех локалей, в которых они были в
TIME_FORMAT,DATETIME_FORMATилиSHORT_DATETIME_FORMAT.Максимальный размер тестового табличного пространства Oracle по умолчанию увеличился с 300M (или 200M, до версии 1.7.2) до 500M.
reverse()иreverse_lazy()теперь возвращают строки Unicode вместо байтовых строк.Псевдоним
CacheClassбыл удален из всех бэкендов кэша. Эти псевдонимы были предоставлены для обратной совместимости с Django 1.3. Если вы все еще используете их, пожалуйста, обновите свой проект, чтобы использовать реальное имя класса, найденное в ключеBACKENDпараметраCACHES.По умолчанию
call_command()теперь всегда пропускает рамки проверки (если только вы не передадите емуskip_checks=False).При итерации по строкам
Fileтеперь используется universal newlines. Окончание строки распознается следующим образом: соглашение Unix о конце строки'\n', соглашение Windows'\r\n'и старое соглашение Macintosh'\r'.Бэкенды кэша Memcached
MemcachedCacheиPyLibMCCacheбудут удалять ключ, еслиset()не работает. Это необходимо для того, чтобы хранилище сессийcache_dbвсегда получало самые актуальные данные сессии.Частные API
override_template_loadersиoverride_with_test_loaderвdjango.test.utilsбыли удалены. Вместо них переопределитеTEMPLATESс помощьюoverride_settings.Предупреждения от бэкенда базы данных MySQL больше не преобразуются в исключения, когда
DEBUGравноTrue.HttpRequestтеперь имеет упрощенноеrepr(например,<WSGIRequest: GET '/somepath/'>). Это не изменит поведение классаSafeExceptionReporterFilter.Представления на основе классов, использующие
ModelFormMixin, будут вызывать исключениеImproperlyConfigured, если указаны оба атрибутаfieldsиform_class. Ранееfieldsмолча игнорировался.При выполнении перенаправлений тестовый клиент теперь поднимает
RedirectCycleError, если обнаруживает цикл или достигает максимального предела перенаправления (а не проходит молча).Переводимые строки, заданные в качестве параметра
defaultполя, впоследствии приводятся к конкретным строкам, поэтому в некоторых случаях возвращаемый типField.get_default()отличается. Значения по умолчанию, которые являются результатом вызываемого поля, не изменяются.GenericIPAddressField.empty_strings_allowedтеперьFalse. Бэкенды баз данных, которые интерпретируют пустые строки как null (только 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 --fake, эта миграция будет пропущена, и вы увидите исключениеRuntimeError: Error creating new content types., поскольку столбецnameне будет удален из базы данных. Используйтеmanage.py migrate --fake-initial, чтобы сымитировать только начальную миграцию.Новая опция
migrate --fake-initialпозволяет подделать начальные миграции. В версии 1.7 начальные миграции всегда автоматически подделывались, если все таблицы, созданные в начальной миграции, уже существовали.Переход от приложения без миграций с
ForeignKeyк приложению с миграциями теперь может привести к ошибке ограничения внешнего ключа при миграции базы данных или запуске тестов. В Django 1.7 это могло происходить молча и приводить к отсутствию ограничения. Чтобы устранить ошибку, добавьте миграции в приложение без них.
Функции, устаревшие в версии 1.8¶
Избранные методы в django.db.models.options.Options¶
В рамках формализации API Model._meta (из класса django.db.models.options.Options), ряд методов были устаревшими и будут удалены в Django 1.10:
get_all_field_names()get_all_related_objects()get_all_related_objects_with_model()get_all_related_many_to_many_objects()get_all_related_m2m_objects_with_model()get_concrete_fields_with_model()get_field_by_name()get_fields_with_model()get_m2m_with_model()
Загрузка тегов шаблонов cycle и firstof из библиотеки future¶
В Django 1.6 появился синтаксис {% load cycle from future %} и {% load firstof from future %} для совместимости с тегами шаблонов cycle и firstof. Сейчас этот синтаксис устарел и будет удален в Django 1.10. Вы можете просто удалить теги {% load ... from future %}.
django.conf.urls.patterns()¶
В старые добрые времена Django рекомендовалось ссылаться на представления как на строки в urlpatterns:
urlpatterns = patterns('',
url('^$', 'myapp.views.myview'),
)
и Django волшебным образом импортирует myapp.views.myview внутрь и превратит строку в настоящую ссылку на функцию. Для того чтобы уменьшить количество повторений при обращении ко многим представлениям из одного модуля, функция patterns() принимает необходимый начальный аргумент prefix, который добавляется ко всем представлениям как строкам в этом наборе urlpatterns:
urlpatterns = patterns('myapp.views',
url('^$', 'myview'),
url('^other/$', 'otherview'),
)
В современную эпоху мы обновили учебник и теперь рекомендуем импортировать модуль представлений и ссылаться на функции (или классы) представлений напрямую. Это имеет ряд преимуществ, все из которых вытекают из того, что мы используем обычный Python вместо «Django String Magic»: ошибки, когда вы неправильно вводите имя представления, менее непонятны, IDE может помочь с автозаполнением имен представлений и т.д.
Поэтому в наши дни вышеприведенное использование аргумента prefix с гораздо большей вероятностью будет записано (и лучше записано) как:
from myapp import views
urlpatterns = patterns('',
url('^$', views.myview),
url('^other/$', views.otherview),
)
Таким образом, patterns() служит мало для чего и является обучением новых пользователей (отвечая на вопрос новичка «зачем мне нужна эта пустая строка в качестве первого аргумента для patterns()?»). По этим причинам мы отказываемся от него. Обновить ваш код так же просто, как убедиться, что urlpatterns является списком экземпляров django.conf.urls.url(). Например:
from django.conf.urls import url
from myapp import views
urlpatterns = [
url('^$', views.myview),
url('^other/$', views.otherview),
]
Передача строки в виде view в 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 является дорогостоящей операцией, поскольку это приводит к импорту реверсируемого пути. Такое поведение также привело к появлению security issue. Вместо этого используйте named URL patterns для реверсирования.
Если вы используете django.contrib.sitemaps, добавьте аргумент name к url, который ссылается на django.contrib.sitemaps.views.sitemap():
from django.contrib.sitemaps.views import sitemap
url(r'^sitemap\.xml$', sitemap, {'sitemaps': sitemaps},
name='django.contrib.sitemaps.views.sitemap')
для обеспечения совместимости при реверсировании по пути Python удалена в Django 1.10.
Аналогично для GIS sitemaps добавьте name='django.contrib.gis.sitemaps.views.kml' или name='django.contrib.gis.sitemaps.views.kmz'.
Если вы используете путь Python для настройки LOGIN_URL или LOGIN_REDIRECT_URL, используйте вместо этого имя url().
Агрегатные методы и модули¶
Модули django.db.models.sql.aggregates и django.contrib.gis.db.models.sql.aggregates (оба частные API) были устаревшими, поскольку django.db.models.aggregates и django.contrib.gis.db.models.aggregates теперь также отвечают за генерацию SQL. Старые модули будут удалены в Django 1.10.
Если вы использовали старые модули, смотрите Query Expressions инструкции по переписыванию пользовательских агрегатов с использованием нового стабильного API.
Следующие методы и свойства django.db.models.sql.query.Query также были устаревшими и будут удалены в Django 1.10:
Query.aggregates, заменяется наannotations.Query.aggregate_select, заменяется наannotation_select.Query.add_aggregate(), заменяется наadd_annotation().Query.set_aggregate_mask(), заменяется наset_annotation_mask().Query.append_aggregate_mask(), заменяется наappend_annotation_mask().
Расширение аргументов команд управления через Command.option_list¶
Команды управления теперь используют argparse вместо optparse для разбора аргументов командной строки, передаваемых командам. Это также означает, что изменился способ добавления пользовательских аргументов в команды: вместо расширения списка классов option_list теперь следует переопределить метод add_arguments() и добавлять аргументы через argparse.add_argument(). Более подробную информацию смотрите в this example.
django.core.management.NoArgsCommand¶
Класс NoArgsCommand сейчас устарел и будет удален в Django 1.10. Вместо него используйте BaseCommand, который по умолчанию не принимает аргументов.
Перечисление всех миграций в проекте¶
Опция --list в команде управления migrate устарела и будет удалена в Django 1.10. Вместо него используйте showmigrations.
cache_choices вариант ModelChoiceField и ModelMultipleChoiceField¶
ModelChoiceField и ModelMultipleChoiceField использовали недокументированную, непроверенную опцию cache_choices. Она кэшировала наборы запросов между несколькими рендерами одного и того же объекта Form. Эта опция подлежит ускоренной депривации и будет удалена в Django 1.9.
django.template.resolve_variable()¶
Эта функция уже некоторое время неофициально помечена как «Устаревшая». Замените resolve_variable(path, context) на django.template.Variable(path).resolve(context).
django.contrib.webdesign¶
В нем был предусмотрен тег шаблона lorem, который теперь включен во встроенные теги. Просто удалите 'django.contrib.webdesign' из INSTALLED_APPS и {% load webdesign %} из ваших шаблонов.
error_message аргумент к django.forms.RegexField¶
Он обеспечивал обратную совместимость с кодом до версии 1.0, но его функциональность является избыточной. Вместо него используйте Field.error_messages['invalid'].
Старый синтаксис unordered_list¶
Старый (до версии 1.0), более строгий и многословный формат ввода для фильтра шаблонов unordered_list был устаревшим:
['States', [['Kansas', [['Lawrence', []], ['Topeka', []]]], ['Illinois', []]]]
Используя новый синтаксис, это становится:
['States', ['Kansas', ['Lawrence', 'Topeka'], 'Illinois']]
django.forms.Field._has_changed()¶
Переименуйте этот метод в has_changed(), удалив ведущее подчеркивание. Старое имя будет работать до версии Django 1.10.
django.utils.html.remove_tags() и removetags фильтр шаблонов¶
django.utils.html.remove_tags(), а также шаблонный фильтр removetags были устаревшими, поскольку они не могут гарантировать безопасный вывод. Их существование, скорее всего, приведет к их использованию в чувствительных к безопасности контекстах, где они на самом деле не являются безопасными.
Неиспользуемая и недокументированная функция django.utils.html.strip_entities() также была упразднена.
is_admin_site аргумент к django.contrib.auth.views.password_reset()¶
Это унаследованная опция, в которой больше нет необходимости.
SubfieldBase¶
django.db.models.fields.subclassing.SubfieldBase был устаревшим и будет удален в Django 1.10. Исторически он использовался для обработки полей, где требовалось преобразование типов при загрузке из базы данных, но он не использовался в вызовах .values() или в агрегатах. Он был заменен на from_db_value().
Новый подход не вызывает метод to_python() при присваивании, как это было в случае с SubfieldBase. Если вам нужно такое поведение, перереализуйте класс Creator from Django’s source code в своем проекте.
django.utils.checksums¶
Модуль django.utils.checksums был устаревшим и будет удален в Django 1.10. Функциональность, которую он предоставлял (проверка контрольной суммы по алгоритму Luhn), была недокументирована и не использовалась в Django. Модуль был перемещен в пакет django-localflavor (версия 1.1+).
InlineAdminForm.original_content_type_id¶
Атрибут original_content_type_id на InlineAdminForm был устаревшим и будет удален в Django 1.10. Исторически он использовался для построения URL «view on site». Теперь этот URL доступен с помощью атрибута absolute_url формы.
django.views.generic.edit.FormMixin.get_form() аргумент form_class¶
Подклассы FormMixin, переопределяющие метод get_form(), должны позаботиться о том, чтобы предоставить значение по умолчанию для аргумента form_class, поскольку теперь он необязателен.
Рендеринг шаблонов, загруженных get_template() с помощью Context¶
В Django 1.8 изменился тип возврата get_template(): вместо django.template.Template он возвращает экземпляр Template, точный тип которого зависит от того, какой бэкенд его загрузил.
Оба класса предоставляют метод render(), однако первый принимает в качестве аргумента django.template.Context, а второй ожидает dict. Это изменение вводится в действие через путь обесценивания для шаблонов Django.
Все это также относится и к select_template().
Классы Template и Context в шаблонных ответах¶
Некоторые методы SimpleTemplateResponse и TemplateResponse принимали в качестве аргументов объекты django.template.Context и django.template.Template. Теперь они должны принимать dict и объекты шаблона, зависящего от бэкенда, соответственно.
Это также относится к типам возврата, если вы подклассифицировали любой из классов шаблона ответа.
Подробности смотрите в template response API documentation.
dictionary и context_instance аргументы функций рендеринга¶
Следующие функции больше не будут принимать параметры dictionary и context_instance в Django 1.10:
django.shortcuts.render()django.shortcuts.render_to_response()django.template.loader.render_to_string()
Вместо этого используйте параметр context. Когда dictionary передается как позиционный аргумент, что является наиболее распространенной идиомой, никаких изменений не требуется.
Если вы передаете Context в context_instance, передайте dict в параметре context вместо этого. Если вы передаете RequestContext, передайте запрос отдельно в параметре request.
dirs аргумент функций поиска шаблонов¶
Следующие функции больше не будут принимать параметр dirs для переопределения TEMPLATE_DIRS в Django 1.10:
django.template.loader.get_template()django.template.loader.select_template()django.shortcuts.render()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 заменяется на compiler¶
В предыдущих версиях Django различные внутренние методы ORM (в основном методы as_sql) принимали аргумент qn (для «quote name»), который представлял собой ссылку на функцию, цитирующую идентификаторы для отправки в базу данных. В Django 1.8 этот аргумент был переименован в compiler и теперь является полноценным экземпляром SQLCompiler. Для обратной совместимости, вызов экземпляра SQLCompiler выполняет то же самое цитирование имен, что и функция qn. Однако, этот шим для обратной совместимости немедленно устаревает: вам следует переименовать ваши аргументы qn в compiler, и вызывать compiler.quote_name_unless_alias(...) там, где вы раньше вызывали qn(...).
Значение по умолчанию RedirectView.permanent¶
Значение по умолчанию атрибута RedirectView.permanent изменится с True на False в Django 1.9.
Использование AuthenticationMiddleware без SessionAuthenticationMiddleware¶
django.contrib.auth.middleware.SessionAuthenticationMiddleware был добавлен в Django 1.7. В Django 1.7.2 его функциональность была перенесена в auth.get_user() и, для обратной совместимости, включена только если 'django.contrib.auth.middleware.SessionAuthenticationMiddleware' появляется в MIDDLEWARE_CLASSES.
В Django 1.10 проверка сессии будет включена независимо от того, включена ли SessionAuthenticationMiddleware (в этом случае SessionAuthenticationMiddleware не будет иметь никакого значения). Вы можете добавить ее в MIDDLEWARE_CLASSES как-нибудь до этого момента, чтобы отказаться от участия. Пожалуйста, сначала прочитайте upgrade considerations.
django.contrib.sitemaps.FlatPageSitemap¶
django.contrib.sitemaps.FlatPageSitemap переместился в django.contrib.flatpages.sitemaps.FlatPageSitemap. Старое расположение импорта устарело и будет удалено в Django 1.9.
ssi шаблонный тег¶
Тег шаблона ssi позволяет включать файлы в шаблон по абсолютному пути. Это ограниченное применение в большинстве ситуаций развертывания, и тег include часто имеет больше смысла. Этот тег устарел и будет удален в Django 1.10.
= как оператор сравнения в теге шаблона if¶
Использование одиночного знака равенства с тегом шаблона {% if %} для проверки равенства было недокументированным и непроверенным. Теперь оно устарело в пользу ==.
Синтаксис %(<foo>)s в ModelFormMixin.success_url¶
Устаревший синтаксис %(<foo>)s в ModelFormMixin.success_url устарел и будет удален в Django 1.10.
GeoQuerySet агрегатные методы¶
Агрегатные методы collect(), extent(), extent3d(), make_line() и unionagg() устарели и должны быть заменены их агрегатными эквивалентами на основе функций (Collect, Extent, Extent3D, MakeLine и Union).
Сигнатура метода маршрутизатора allow_migrate¶
Подпись метода allow_migrate() маршрутизаторов базы данных изменилась с allow_migrate(db, model) на allow_migrate(db, app_label, model_name=None, **hints).
Если установлено значение model_name, то значение, которое ранее было задано через позиционный аргумент model, теперь можно найти в словаре hints под ключом 'model'.
После перехода на новую сигнатуру маршрутизатор также будет вызываться операциями RunPython и RunSQL.
Функции, удаленные в 1.8¶
Эти функции достигли конца цикла устаревания и будут удалены в Django 1.8. Смотрите Функции, устаревшие в версии 1.6 для подробностей, включая то, как удалить использование этих функций.
django.contrib.commentsудаляется.- Следующие API управления транзакциями удалены:
TransactionMiddleware- декораторы и менеджеры контекста
autocommit,commit_on_successиcommit_manually, определенные вdjango.db.transaction - функции
commit_unless_managedиrollback_unless_managed, также определенные вdjango.db.transaction - установка
TRANSACTIONS_MANAGED
- Теги шаблонов
cycleиfirstofавтоэскейпируют свои аргументы. - Настройка
SEND_BROKEN_LINK_EMAILSудаляется. django.middleware.doc.XViewMiddlewareудаляется.- Псевдоним
Model._meta.module_nameудаляется. - Удалены обратно совместимые шиммы, введенные для переименования
get_query_setи аналогичных методов queryset. Это затрагивает следующие классы:BaseModelAdmin,ChangeList,BaseCommentNode,GenericForeignKey,Manager,SingleRelatedObjectDescriptorиReverseSingleRelatedObjectDescriptor. - Удалены шиммы обратной совместимости, введенные для переименования атрибутов
ChangeList.root_query_setиChangeList.query_set. django.views.defaults.shortcutиdjango.conf.urls.shortcutудаляются.- Удалена поддержка модуля Python Imaging Library (PIL).
- Следующие частные API удалены:
django.db.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больше не считывается для обратной совместимости. - Географические карты сайта удалены (
django.contrib.gis.sitemaps.views.indexиdjango.contrib.gis.sitemaps.views.sitemap). django.utils.html.fix_ampersands, фильтр шаблоновfix_ampersandsиdjango.utils.html.clean_htmlудалены.