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