Примечания к выпуску 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
теперь поддерживаютForeignKey
s.- Количество итераций по умолчанию для хешера паролей 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
теперь являютсяQueryDict
s, а не словарями, а атрибут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
были изменены так, чтобы автоматически экранировать их входное значение:
join
linebreaksbr
linebreaks_filter
linenumbers
unordered_list
urlize
urlizetrunc
Вы можете вернуться к старому поведению, указав autoescape=False
, если вы передаете доверенное содержимое. Это изменение не влияет на использование соответствующих фильтров в шаблонах.
Разное¶
connections.queries
теперь является атрибутом только для чтения.Соединения базы данных считаются одинаковыми, только если они являются одним и тем же объектом. Они больше не являются хэшируемыми.
GZipMiddleware
используется для отключения сжатия для некоторых типов контента при запросе из Internet Explorer, чтобы обойти ошибку в IE6 и более ранних версиях. Такое поведение могло повлиять на производительность в IE7 и более поздних версиях. Оно было удалено.URLField.to_python
больше не добавляет косую черту в URL без пути.Фильтр шаблона
length
теперь возвращает0
для неопределенной переменной, а не пустую строку.ForeignKey.default_error_message['invalid']
был изменен с'%(model)s instance with pk %(pk)r does not exist.'
на'%(model)s instance with %(field)s %(value)r does not exist.'
Если вы используете это сообщение в своем собственном коде, пожалуйста, обновите список интерполируемых параметров. Внутри Django будет продолжать предоставлять параметрpk
вparams
для обратной совместимости.UserCreationForm.error_messages['duplicate_username']
больше не используется. Если вы хотите настроить это сообщение об ошибке, override it on the form используйте ключ'unique'
вMeta.error_messages['username']
или, если у вас есть пользовательское поле формы для'username'
, используйте ключ'unique'
в его аргументеerror_messages
.Блок
usertools
в шаблонеbase.html
шаблонаdjango.contrib.admin
теперь требует установки контекстной переменнойhas_permission
. Если у вас есть пользовательские представления администратора, использующие этот шаблон, обновите их, чтобы передатьAdminSite.has_permission()
в качестве значения этой новой переменной или просто включитеAdminSite.each_context(request)
в контекст.В виджете
ClearableFileInput
были сделаны внутренние изменения, чтобы обеспечить более широкую настройку. Недокументированный атрибутurl_markup_template
был удален в пользуtemplate_with_initial
.Для согласованности с другими крупными производителями, локаль
en_GB
теперь имеет понедельник в качестве первого дня недели.Секунды были удалены из всех локалей, в которых они были в
TIME_FORMAT
,DATETIME_FORMAT
илиSHORT_DATETIME_FORMAT
.Максимальный размер тестового табличного пространства Oracle по умолчанию увеличился с 300M (или 200M, до версии 1.7.2) до 500M.
reverse()
иreverse_lazy()
теперь возвращают строки Unicode вместо байтовых строк.Псевдоним
CacheClass
был удален из всех бэкендов кэша. Эти псевдонимы были предоставлены для обратной совместимости с Django 1.3. Если вы все еще используете их, пожалуйста, обновите свой проект, чтобы использовать реальное имя класса, найденное в ключеBACKEND
параметраCACHES
.По умолчанию
call_command()
теперь всегда пропускает рамки проверки (если только вы не передадите емуskip_checks=False
).При итерации по строкам
File
теперь используется universal newlines. Окончание строки распознается следующим образом: соглашение Unix о конце строки'\n'
, соглашение Windows'\r\n'
и старое соглашение Macintosh'\r'
.Бэкенды кэша Memcached
MemcachedCache
иPyLibMCCache
будут удалять ключ, еслиset()
не работает. Это необходимо для того, чтобы хранилище сессийcache_db
всегда получало самые актуальные данные сессии.Частные API
override_template_loaders
иoverride_with_test_loader
вdjango.test.utils
были удалены. Вместо них переопределитеTEMPLATES
с помощьюoverride_settings
.Предупреждения от бэкенда базы данных MySQL больше не преобразуются в исключения, когда
DEBUG
равноTrue
.HttpRequest
теперь имеет упрощенноеrepr
(например,<WSGIRequest: GET '/somepath/'>
). Это не изменит поведение классаSafeExceptionReporterFilter
.Представления на основе классов, использующие
ModelFormMixin
, будут вызывать исключениеImproperlyConfigured
, если указаны оба атрибутаfields
иform_class
. Ранееfields
молча игнорировался.При выполнении перенаправлений тестовый клиент теперь поднимает
RedirectCycleError
, если обнаруживает цикл или достигает максимального предела перенаправления (а не проходит молча).Переводимые строки, заданные в качестве параметра
default
поля, впоследствии приводятся к конкретным строкам, поэтому в некоторых случаях возвращаемый типField.get_default()
отличается. Значения по умолчанию, которые являются результатом вызываемого поля, не изменяются.GenericIPAddressField.empty_strings_allowed
теперьFalse
. Бэкенды баз данных, которые интерпретируют пустые строки как null (только 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.backend
django.db.close_connection()
django.db.backends.creation.BaseDatabaseCreation.set_autocommit()
django.db.transaction.is_managed()
django.db.transaction.managed()
django.forms.widgets.RadioInput
удаляется.- Модуль
django.test.simple
и классdjango.test.simple.DjangoTestSuiteRunner
удалены. - Модуль
django.test._doctest
удален. - Настройка
CACHE_MIDDLEWARE_ANONYMOUS_ONLY
удалена. Это изменение затрагивает какdjango.middleware.cache.CacheMiddleware
, так иdjango.middleware.cache.UpdateCacheMiddleware
, несмотря на отсутствие предупреждения об устаревании в последнем классе. - Использование жестко закодированной Удерживайте «Control», или «Command» на Mac, чтобы выбрать более одной. строки для переопределения или добавления к предоставленным пользователем
help_text
в формах дляManyToMany
полей модели больше не выполняется Django ни на уровне модели, ни на уровне форм. - Методы
Model._meta.get_(add|change|delete)_permission
удалены. - Ключ сессии
django_language
больше не считывается для обратной совместимости. - Географические карты сайта удалены (
django.contrib.gis.sitemaps.views.index
иdjango.contrib.gis.sitemaps.views.sitemap
). django.utils.html.fix_ampersands
, фильтр шаблоновfix_ampersands
иdjango.utils.html.clean_html
удалены.