Примечания к выпуску Django 1.9 ¶
1 декабря 2015 г.
Добро пожаловать в Django 1.9!
Эти примечания к выпуску охватывают новые функции , а также некоторые обратно несовместимые изменения, о которых вам нужно знать при обновлении с Django 1.8 или более старых версий. Мы отказались от некоторых функций , срок действия которых подошел к концу, и мы начали процесс прекращения поддержки некоторых функций .
См. Руководство по обновлению Django до более новой версии, если вы обновляете существующий проект.
Совместимость с Python ¶
Django 1.9 требует Python 2.7, 3.4 или 3.5. Мы настоятельно рекомендуем и официально поддерживаем только последний выпуск каждой серии.
Серия Django 1.8 является последней, поддерживающей Python 3.2 и 3.3.
Что нового в Django 1.9 ¶
Выполнение действий после фиксации транзакции ¶
Новый on_commit()
хук позволяет выполнять действия после успешной фиксации транзакции базы данных. Это полезно для таких задач, как отправка уведомлений по электронной почте, создание задач в очереди или аннулирование кешей.
Эта функциональность из пакета django-transaction-hooks была интегрирована в Django.
Проверка пароля ¶
Django теперь предлагает проверку пароля, чтобы предотвратить использование пользователями слабых паролей. Проверка интегрирована во включенные формы смены и сброса пароля и легко интегрируется в любой другой код. Проверка выполняется одним или несколькими валидаторами, настроенными в новой
AUTH_PASSWORD_VALIDATORS
настройке.
В Django включены четыре валидатора, которые могут устанавливать минимальную длину, сравнивать пароль с атрибутами пользователя, такими как их имя, обеспечивать, чтобы пароли не были полностью числовыми, или сверяться с включенным списком общих паролей. Вы можете комбинировать несколько валидаторов, и некоторые валидаторы имеют настраиваемые параметры конфигурации. Например, вы можете указать собственный список общих паролей. Каждый валидатор предоставляет пользователю текст справки, объясняющий его требования.
По умолчанию проверка не выполняется, и все пароли принимаются, поэтому, если вы не установите AUTH_PASSWORD_VALIDATORS
, вы не увидите никаких изменений. В новых проектах, созданных с использованием startproject
шаблона по умолчанию , включен простой набор валидаторов. Чтобы включить базовую проверку во включенных формах авторизации для вашего проекта, вы можете установить, например:
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
См. Дополнительные сведения в разделе « Проверка пароля» .
Примеси разрешений для представлений на основе классов ¶
Django теперь поставляется с Mixins
AccessMixin
,
LoginRequiredMixin
,
PermissionRequiredMixin
и
, UserPassesTestMixin
чтобы обеспечить функциональность django.contrib.auth.decorators
для представлений , основанных на классах. Эти миксины были взяты из проекта django-braces или, по крайней мере, вдохновлены им
.
Однако есть несколько различий между реализациями Django и django-braces
':
raise_exception
Атрибут может быть толькоTrue
илиFalse
. Пользовательские исключения или вызываемые объекты не поддерживаются.handle_no_permission()
Метод не принимаетrequest
аргумент. Текущий запрос доступен в форматеself.request
.- Обычай
test_func()
изUserPassesTestMixin
не принимаетuser
аргумент. Текущий пользователь доступен в форматеself.request.user
. permission_required
Атрибут поддерживает строку (определение одного разрешения) или список / кортеж строк (определение нескольких разрешений) , которые должны быть выполнены для предоставления доступа.- Новый
permission_denied_message
атрибут позволяет передать сообщениеPermissionDenied
исключению.
Новый стиль для contrib.admin
¶
Админка имеет современный плоский дизайн с новыми значками SVG, которые идеально смотрятся на экранах HiDPI. Он по-прежнему обеспечивает полнофункциональную работу с браузерами YUI класса A. В старых версиях браузера могут наблюдаться различные уровни постепенной деградации.
Параллельное выполнение тестов ¶
Теперь test
команда поддерживает --parallel
возможность параллельного запуска тестов проекта в нескольких процессах.
Каждый процесс получает свою базу данных. Вы должны убедиться, что разные тестовые примеры не обращаются к одним и тем же ресурсам. Например, тестовые примеры, которые касаются файловой системы, должны создавать временный каталог для собственного использования.
Эта опция включена по умолчанию для собственного набора тестов Django:
- ОС поддерживает это (все, кроме Windows)
- бэкэнд базы данных поддерживает его (все встроенные бэкэнды, кроме Oracle)
Незначительные особенности ¶
django.contrib.admin
¶
- Представления администратора теперь имеют атрибуты
model_admin
илиadmin_site
. - URL-адрес представления изменений администратора был изменен (
/admin/<app>/<model>/<pk>/
по умолчанию был по адресу , а теперь находится по адресу/admin/<app>/<model>/<pk>/change/
). Это не должно повлиять на ваше приложение, если у вас нет жестко заданных URL-адресов администратора. В этом случае замените эти ссылки, изменив адреса администратора . Обратите внимание, что старый URL-адрес по-прежнему перенаправляется на новый для обратной совместимости, но он может быть удален в будущей версии. ModelAdmin.get_list_select_related()
был добавлен, чтобы разрешить изменениеselect_related()
значений, используемых в запросе списка изменений администратора на основе запроса.- В
метод
available_apps
была добавлена контекстная переменная, в которой перечислены доступные приложения для текущего пользователяAdminSite.each_context()
. AdminSite.empty_value_display
иModelAdmin.empty_value_display
были добавлены, чтобы переопределить отображение пустых значений в списке изменений администратора. Вы также можете настроить значение для каждого поля.- Добавлены события jQuery при добавлении или удалении встроенной формы на странице формы изменения.
- Виджет выбора времени включает опцию «6 часов вечера» для единообразия наличия предопределенных опций каждые 6 часов.
- Генерация ярлыков JavaScript теперь поддерживает румынские символы.
django.contrib.admindocs
¶
- В разделе модели
admindocs
now также описаны методы, которые принимают аргументы, а не игнорируют их.
django.contrib.auth
¶
- Количество итераций по умолчанию для хешера паролей PBKDF2 увеличено на 20%. Это изменение с обратной совместимостью не повлияет на пользователей, которые создали подклассы,
django.contrib.auth.hashers.PBKDF2PasswordHasher
чтобы изменить значение по умолчанию. - Теперь
BCryptSHA256PasswordHasher
будет обновлять пароли, если егоrounds
атрибут будет изменен. AbstractBaseUser
иBaseUserManager
были перенесены в новыйdjango.contrib.auth.base_user
модуль , так что они могут быть импортированы без включенияdjango.contrib.auth
вINSTALLED_APPS
(не делая так подняли предупреждение устаревания в старых версиях и больше не поддерживается в Django 1.9).- Аргумент разрешения
permission_required()
принимает все виды итераций, а не только списки и кортежи. - Новое
PersistentRemoteUserMiddleware
позволяет использоватьREMOTE_USER
для настроек, в которых заголовок заполняется только на страницах входа в систему, а не при каждом запросе в сеансе. - Представление
django.contrib.auth.views.password_reset()
принимаетextra_email_context
параметр.
django.contrib.contenttypes
¶
- Теперь можно использовать
order_with_respect_to
сGenericForeignKey
.
django.contrib.gis
¶
- Все
GeoQuerySet
методы устарели и заменены эквивалентными функциями базы данных . Как только унаследованные методы будут заменены в вашем коде, вы даже сможете удалить специальныеGeoManager
из ваших классов с поддержкой ГИС. - Интерфейс GDAL теперь поддерживает создание экземпляров файловых объектов и объектов GDALRaster в памяти из необработанных данных. Добавлены сеттеры для свойств растра, таких как проекция или значения пикселей.
- Для пользователей PostGIS новая
RasterField
возможность позволяет хранить объекты GDALRaster . Он поддерживает автоматическое создание пространственного индекса и перепроецирование при сохранении модели. Он еще не поддерживает пространственные запросы. - Новый
GDALRaster.warp()
метод позволяет деформировать растр, задавая свойства целевого растра, такие как начало координат, ширина, высота или размер в пикселях (среди прочего). - Новый
GDALRaster.transform()
метод позволяет преобразовать растр в другую систему пространственной привязки, указав цельsrid
. - Новый
GeoIP2
класс позволяет использовать базы данных MaxMind GeoLite2, которые включают поддержку адресов IPv6. - Версия библиотеки OpenLayers по умолчанию, включенная в виджеты, была обновлена с 2.13 до 2.13.1.
django.contrib.postgres
¶
- Добавлена поддержка
rangefield.contained_by
поиска для некоторых встроенных полей, соответствующих полям диапазона. - Добавлен
JSONField
. - Добавлены специальные функции агрегирования PostgreSQL .
- Добавлена
TransactionNow
функция базы данных.
django.contrib.sessions
¶
- Модель сессии и
SessionStore
классы дляdb
иcached_db
бэкэнды переработан , чтобы пользовательские сессии серверной базы данных , чтобы построить на них. Дополнительные сведения см. В разделе Расширение механизмов сеансов на основе базы данных .
django.contrib.sites
¶
get_current_site()
теперь обрабатывает случай, когдаrequest.get_host()
возвращаетсяdomain:port
, напримерexample.com:80
. Если поиск завершается неудачно, потому что хост не соответствует записи в базе данных и у хоста есть порт, порт удаляется, и поиск повторяется только с доменной частью.
django.contrib.syndication
¶
- Добавлена поддержка нескольких вложений для каждого элемента фида. Если для RSS-канала определено несколько вложений, возникает исключение, поскольку RSS-каналы, в отличие от каналов Atom, не поддерживают несколько вложений для каждого элемента канала.
Кэш ¶
django.core.cache.backends.base.BaseCache
теперь естьget_or_set()
метод.django.views.decorators.cache.never_cache()
теперь посылает более убедительные заголовки (добавлены к ) , чтобы лучше предотвратить кэширование. Это также было добавлено в Django 1.8.8.no-cache, no-store, must-revalidate
Cache-Control
CSRF ¶
- Имя заголовка запроса, используемого для аутентификации CSRF, можно настроить с помощью
CSRF_HEADER_NAME
. - Заголовок реферера CSRF теперь проверяется на соответствие
CSRF_COOKIE_DOMAIN
параметру, если он установлен. См. Подробности в разделе « Как это работает» . - Новый
CSRF_TRUSTED_ORIGINS
параметр позволяет разрешить небезопасные запросы из разных источников (напримерPOST
) через HTTPS.
Бэкэнды базы данных ¶
- Бэкэнд PostgreSQL (
django.db.backends.postgresql_psycopg2
) также доступен какdjango.db.backends.postgresql
. Старое имя будет по-прежнему доступно для обратной совместимости.
Файловое хранилище ¶
Storage.get_valid_name()
теперь вызывается, когдаupload_to
вызывается.File
теперь естьseekable()
метод при использовании Python 3.
Формы ¶
ModelForm
принимает новуюMeta
опциюfield_classes
для настройки типа полей. См. Подробности в разделе « Замена полей по умолчанию» .- Теперь вы можете указать порядок, в котором поля формы отображаются с
field_order
атрибутом,field_order
аргументом конструктора илиorder_fields()
методом. - Префикс формы можно указать внутри класса формы, а не только при создании экземпляра формы. См. Подробности в разделе « Префиксы» для форм .
- Теперь вы можете указать аргументы ключевого слова, которые вы хотите передать конструктору форм в наборе форм.
SlugField
теперь принимаетallow_unicode
аргумент, разрешающий использование символов Юникода в ярлыках.CharField
теперь принимаетstrip
аргумент для удаления начальных и конечных пробелов из входных данных. По умолчаниюTrue
это поведение отличается от предыдущих выпусков.- Поля формы теперь поддерживают
disabled
аргумент, что позволяет отображать виджет поля отключенным браузерами. - Теперь можно настроить связанные поля, переопределив
get_bound_field()
метод поля .
Общие представления ¶
- Представления на основе классов, созданные с использованием атрибутов
as_view()
now haveview_class
иview_initkwargs
. method_decorator()
теперь можно использовать со списком или кортежем декораторов. Его также можно использовать для украшения классов вместо методов .
Интернационализация ¶
- Теперь
django.views.i18n.set_language()
представление правильно перенаправляется на переведенные URL-адреса , если они доступны. - Представление
django.views.i18n.javascript_catalog()
теперь работает правильно, если его использовать несколько раз с разными конфигурациями на одной странице. django.utils.timezone.make_aware()
Функция получилаis_dst
аргумент , чтобы помочь решить неоднозначных раз во время перехода на летнее время переходов.- Теперь вы можете использовать варианты локали, поддерживаемые gettext. Обычно они используются для языков, которые могут быть написаны разными шрифтами, например, латиницей и кириллицей (например
[email protected]
). - Добавлен
django.views.i18n.json_catalog()
вид, помогающий создавать настраиваемую клиентскую библиотеку i18n на основе переводов Django. Он возвращает объект JSON, содержащий каталог переводов, настройки форматирования и правило множественного числа. - Добавлен
name_translated
атрибут к объекту, возвращаемомуget_language_info
тегом шаблона. Также добавлен соответствующий шаблон фильтра:language_name_translated
. - Теперь вы можете запустить
compilemessages
из корневого каталога вашего проекта, и он найдет все файлы сообщений приложения, которые были созданы с помощьюmakemessages
. makemessages
теперь вызывает xgettext один раз для каждого каталога локали, а не один раз для переводимого файла. Это ускоряет сборку локализации.blocktrans
поддерживает присвоение своего вывода переменной с помощьюasvar
.- Доступны два новых языка: колумбийский испанский и шотландский гэльский.
Команды управления ¶
- Новая
sendtestemail
команда позволяет вам отправить тестовое электронное письмо, чтобы легко убедиться, что отправка электронной почты через Django работает. - Чтобы повысить удобочитаемость кода SQL, сгенерированного с помощью
sqlmigrate
, коду SQL, сгенерированному для каждой операции миграции, предшествует описание операции. - Теперь
dumpdata
вывод команды упорядочен детерминированно. Более того, когда--output
опция указана, в терминале также отображается индикатор выполнения. - Теперь у
createcachetable
команды есть--dry-run
флаг для распечатки SQL, а не для его выполнения. - Команда
startapp
создаетapps.py
файл. Поскольку он не используетdefault_app_config
( обескураженный API ), вы должны указать путь к конфигурации приложения, например'polls.apps.PollsConfig'
,INSTALLED_APPS
для его использования (а не просто'polls'
). - При использовании серверной части PostgreSQL
dbshell
команда может подключаться к базе данных, используя пароль из вашего файла настроек (вместо того, чтобы требовать его ввода вручную). django
Пакет может быть запущен в качестве сценария, то есть , который будет вести себя так же , как .python -m django
django-admin
- Команды управления, которые
--noinput
теперь имеют эту опцию, также принимают--no-input
в качестве псевдонима для этой опции.
Миграции ¶
Начальные миграции теперь помечаются атрибутом класса, который позволяет более легко обнаруживать начальные миграции.
initial = True
migrate --fake-initial
Добавлена поддержка сериализации
functools.partial
иLazyObject
экземпляров.При указании
None
значения вMIGRATION_MODULES
Django будет рассматривать приложение как приложение без миграций.При применении миграций шаг «Отрисовка состояний модели», отображаемый при запуске миграции с уровнем детализации 2 или выше, теперь вычисляет только состояния для уже примененных миграций. Состояния модели для применяемых миграций генерируются по запросу, что резко снижает объем требуемой памяти.
Однако это улучшение недоступно при неприменении миграций и, следовательно, по-прежнему требует предварительного вычисления и хранения промежуточных состояний миграции.
Это улучшение также требует, чтобы Django больше не поддерживал смешанные планы миграции. Смешанные планы состоят из списка миграций, в которых одни применяются, а другие не применяются. Это никогда официально не поддерживалось, и никогда не было общедоступного API, поддерживающего такое поведение.
Теперь
squashmigrations
команда поддерживает указание начальной миграции, из которой миграции будут подавлены.
Модели ¶
QuerySet.bulk_create()
теперь работает на прокси-моделях.- Конфигурация базы данных получила
TIME_ZONE
возможность взаимодействия с базами данных, которые хранят дату и время по местному времени и не поддерживают часовые пояса, когдаUSE_TZ
естьTrue
. - Добавлен
RelatedManager.set()
метод соответствующих менеджеров , созданныхForeignKey
,GenericForeignKey
иManyToManyField
. add()
Способ по обратному внешнему ключу теперь имеетbulk
параметр , чтобы разрешить выполнение одного запроса , независимо от количества объектов добавляются , а не одного запроса на объект.- Добавлен
keep_parents
параметр,Model.delete()
позволяющий удалять только дочерние данные в модели, использующей многотабличное наследование. Model.delete()
иQuerySet.delete()
вернуть количество удаленных объектов.- Добавлена проверка системы, чтобы предотвратить определение обоих
Meta.ordering
иorder_with_respect_to
для одной и той же модели. Date and time
поиски могут быть соединены с другими выборками (напримерexact
,gt
,lt
и т.д.). Например:Entry.objects.filter(pub_date__month__gt=6)
.- Поиск времени (час, минута, секунда) теперь поддерживается
TimeField
для всех баз данных. Поддержка других серверных программ, кроме SQLite, была добавлена, но недокументирована в Django 1.7. - Вы можете указать
output_field
параметрAvg
агрегата для агрегирования по нечисловым столбцам, напримерDurationField
. - Добавлен
date
поиск,DateTimeField
позволяющий запрашивать поле только по дате. - Добавлены функции
Greatest
иLeast
базы данных. - Добавлена
Now
функция базы данных, которая возвращает текущую дату и время. Transform
теперь является подклассом Func (), который позволяет использоватьTransform
s в правой части выражения, как и обычныйFunc
s. Это позволяет регистрировать некоторые функции базы данных , какLength
,Lower
иUpper
как преобразования.SlugField
теперь принимаетallow_unicode
аргумент, разрешающий использование символов Юникода в ярлыках.- Добавлена поддержка ссылок на аннотации в
QuerySet.distinct()
. connection.queries
показывает запросы с подставленными параметрами на SQLite.- Выражения запросов теперь могут быть использованы при создании новых экземпляров модели использования
save()
,create()
иbulk_create()
.
Запросы и ответы ¶
- Если не указано
HttpResponse.reason_phrase
явно, теперь он определяется текущим значениемHttpResponse.status_code
. Изменение значенияstatus_code
вне конструктора также изменит значениеreason_phrase
. - В представлении отладки теперь отображаются сведения о связанных исключениях в Python 3.
- Представления ошибок 40x по умолчанию теперь принимают второй позиционный параметр, исключение, которое запускало представление.
- Теперь поддерживаются обработчики ошибок представления
TemplateResponse
, обычно используемые с представлениями на основе классов. - Исключения, вызванные этим
render()
методом, теперь передаютсяprocess_exception()
методу каждого промежуточного программного обеспечения. - Для промежуточного программного обеспечения запроса теперь можно установить
HttpRequest.urlconf
значение,None
чтобы отменить любые изменения, сделанные предыдущим промежуточным программным обеспечением, и вернуться к использованиюROOT_URLCONF
. DISALLOWED_USER_AGENTS
Проверка вCommonMiddleware
настоящее вызываетPermissionDenied
исключение , а не возвращаяHttpResponseForbidden
таким образом , чтоhandler403
вызывается.- Добавлен
HttpRequest.get_port()
для получения исходного порта запроса. - Добавлен
json_dumps_params
параметр,JsonResponse
позволяющий передавать аргументы ключевого словаjson.dumps()
вызову, используемому для генерации ответа. BrokenLinkEmailsMiddleware
Теперь игнорирует ошибки 404 , когда реферер равно запрошенный URL. Чтобы обойти уже реализованную проверку пустого реферера, некоторые веб-боты устанавливают реферер на запрошенный URL.
Шаблоны ¶
- Теги шаблона, созданные с помощью
simple_tag()
помощника, теперь могут сохранять результаты в переменной шаблона с помощьюas
аргумента. - Добавил
Context.setdefault()
метод. - Django.template Добавляли регистратор и включает в себя следующие сообщения:
DEBUG
Сообщение уровня недостающих переменных контекста.WARNING
Сообщение уровня для неперехваченных исключений , заданных в ходе рендеринга , когда режим отладки выключен (полезно , так как паузы исключения и возвращается пустая строка).{% include %}
{% include %}
- В
firstof
шаблон тегов поддерживает хранение выходных данных в переменной , используя «как». Context.update()
теперь можно использовать как диспетчер контекста.- Загрузчики шаблонов Django теперь могут рекурсивно расширять шаблоны.
- Посмертное вскрытие шаблона страницы отладки теперь включает вывод каждого установленного движка.
- Добавлена интеграция отладочной страницы для пользовательских шаблонизаторов.
DjangoTemplates
Бэкенд получила возможность регистрации библиотек и встроенных команд в явном виде с помощью шаблонаOPTIONS
.timesince
Иtimeuntil
фильтры были улучшены , чтобы иметь дело с високосными годами , когда данные большие пролеты времени.include
Теперь тег кэширует разобранные шаблоны объекты во время рендеринга шаблонов, ускорение повторного использования в таких местах, как для петель.
Тесты ¶
- Добавлен
json()
метод проверки ответов клиентов, чтобы предоставить доступ к телу ответа как JSON. - Добавлен
force_login()
метод в тестовый клиент. Используйте этот метод для имитации эффекта входа пользователя на сайт при пропуске этапов аутентификации и проверкиlogin()
.
URL-адреса ¶
- Утверждения поиска по регулярным выражениям теперь разрешены в шаблонах URL.
- Пространство имен приложения теперь можно задать с помощью
app_name
атрибута во включенном модуле или объекте. Его также можно установить, передав кортеж из двух элементов (<список шаблонов>, <пространство имен приложений>) в качестве первого аргумента вinclude()
. - Добавлены системные проверки на предмет распространенных ошибок в шаблоне URL.
Валидаторы ¶
- Добавлен
django.core.validators.int_list_validator()
для создания валидаторов строк, содержащих целые числа, разделенные настраиваемым символом. EmailValidator
теперь ограничивает длину меток доменных имен до 63 символов на RFC 1034 .- Добавлен
validate_unicode_slug()
для проверки ярлыков, которые могут содержать символы Юникода.
Обратно несовместимые изменения в 1.9 ¶
Предупреждение
В дополнение к изменениям, описанным в этом разделе, обязательно ознакомьтесь с функциями, удаленными в версии 1.9, для тех функций, которые достигли конца цикла устаревания и, следовательно, были удалены. Если вы не обновили свой код в течение срока прекращения поддержки для данной функции, ее удаление может показаться обратным несовместимым изменением.
API серверной части базы данных ¶
Пара новых тестов полагается на способность серверной части анализировать значения столбцов по умолчанию (возвращая результат как
Field.default
). Вы можете установитьcan_introspect_default
функцию базы данных,False
если ваш бэкэнд не реализует это. Вы можете ознакомиться с реализацией бэкэндов, которые Django включает для справки ( # 24245 ).Не рекомендуется регистрировать глобальный адаптер или преобразователь на уровне модуля DB-API для обработки информации о часовом поясе
datetime
значений, передаваемых в качестве параметров запроса или возвращаемых в качестве результатов запроса в базах данных, которые не поддерживают часовые пояса. Это может конфликтовать с другими библиотеками.Рекомендуемый способ добавить часовой пояс к
datetime
значениям, полученным из базы данных, - зарегистрировать преобразователь дляDateTimeField
inDatabaseOperations.get_db_converters()
.Функция
needs_datetime_string_cast
базы данных была удалена. Бэкенды базы данных, которые его устанавливают, должны вместо этого зарегистрировать преобразователь, как описано выше.Эти
DatabaseOperations.value_to_db_<type>()
методы были переименованы в ,adapt_<type>field_value()
чтобы отражатьconvert_<type>field_value()
методы.Чтобы использовать новый
date
поиск, сторонним серверным модулям базы данных может потребоваться реализовать этотDatabaseOperations.datetime_cast_date_sql()
метод.DatabaseOperations.time_extract_sql()
Метод был добавлен. Он вызывает существующийdate_extract_sql()
метод. Этот метод переопределяется серверной частью SQLite, чтобы добавить поиск по времени (час, минута, секунда)TimeField
, и может потребоваться сторонним серверным модулям базы данных.DatabaseOperations.datetime_cast_sql()
Метод (не следует путать сDatabaseOperations.datetime_cast_date_sql()
упомянуто выше) был удален. Этот метод служил для форматирования дат в Oracle задолго до версии 1.0, но уже много лет не отменяется никакими ядрами серверной части и нигде не вызывается в коде или тестах Django.Для поддержки распараллеливания тестов необходимо реализовать
DatabaseCreation._clone_test_db()
метод и установить . Возможно, вам придется приспособиться .DatabaseFeatures.can_clone_databases = True
DatabaseCreation.get_test_db_clone_settings()
Настройки по умолчанию, которые были кортежами, теперь представлены списками ¶
Настройки по умолчанию в django.conf.global_settings
представляли собой комбинацию списков и кортежей. Все настройки, которые раньше были кортежами, теперь являются списками.
is_usable
атрибут в загрузчиках шаблонов удален ¶
Загрузчики шаблонов Django ранее требовали определения is_usable
атрибута. Если загрузчик был настроен в настройках шаблона и этот атрибут был False
, загрузчик будет автоматически проигнорирован. На практике это использовалось только загрузчиком яиц, чтобы определить, был ли установлен setuptools. is_usable
Атрибут теперь удаляется и яйцо загрузчик вместо терпит неудачу во время выполнения , если Setuptools не установлен.
Загрузчики шаблонов на основе файловой системы улавливают более конкретные исключения ¶
При использовании
загрузчиков шаблонов filesystem.Loader
или app_directories.Loader
более ранние версии Django выдавали
TemplateDoesNotExist
ошибку, если источник шаблона существовал, но был нечитаемым. Это могло произойти при многих обстоятельствах, например, если у Django не было разрешений на открытие файла или если источником шаблона был каталог. Теперь Django заглушает исключение только в том случае, если источник шаблона не существует. Во всех остальных случаях оригинал IOError
поднимается.
Перенаправления HTTP больше не принудительно привязаны к абсолютным URI ¶
Относительные перенаправления больше не преобразуются в абсолютные URI. RFC 2616
требовал, чтобыLocation
заголовок в ответах на перенаправление был абсолютным URI, но он был заменен наRFC 7231, который разрешает относительные URI
Location
, признавая фактическую практику пользовательских агентов, почти все из которых их поддерживают.
Следовательно, ожидаемые URL-адреса, передаваемые на, assertRedirects
как правило, больше не должны включать в себя часть URL-адресов схемы и домена. Например,
следует заменить на (если перенаправление специально не содержит абсолютный URL-адрес).self.assertRedirects(response, 'http://testserver/some-url/')
self.assertRedirects(response, '/some-url/')
В том редком случае, когда вам нужно старое поведение (обнаруженное с помощью древней версии Apache, mod_scgi
которая интерпретирует относительное перенаправление как «внутреннее перенаправление»), вы можете восстановить его, написав специальное промежуточное ПО:
class LocationHeaderFix(object):
def process_response(self, request, response):
if 'Location' in response:
response['Location'] = request.build_absolute_uri(response['Location'])
return response
Прекращена поддержка PostgreSQL 9.0 ¶
Поддержка PostgreSQL 9.0 в апстриме закончилась в сентябре 2015 года. Как следствие, Django 1.9 устанавливает 9.1 как минимальную официально поддерживаемую версию PostgreSQL.
Прекращена поддержка Oracle 11.1 ¶
Поддержка Oracle 11.1 в апстриме закончилась в августе 2015 года. Как следствие, Django 1.9 устанавливает 11.2 как минимальную официально поддерживаемую версию Oracle.
Шаблон LoaderOrigin
и StringOrigin
удаляются ¶
В предыдущих версиях Django, когда механизм шаблонов был инициализирован с помощью debug as True
, экземпляр django.template.loader.LoaderOrigin
или
django.template.base.StringOrigin
был установлен в качестве атрибута origin для объекта шаблона. Эти классы были объединены в
Origin
и теперь всегда устанавливаются независимо от настройки отладки движка. Для минимального уровня обратной совместимости старые имена классов будут сохранены как псевдонимы для нового Origin
класса до Django 2.0.
Изменения в конфигурации ведения журнала по умолчанию ¶
Чтобы упростить написание пользовательских конфигураций ведения журнала, стандартная конфигурация ведения журнала Django больше не определяет django.request
и
django.security
регистраторы. Вместо этого он определяет один django
регистратор, отфильтрованный на INFO
уровне, с двумя обработчиками:
console
: фильтруется наINFO
уровне и активен, только еслиDEBUG=True
.mail_admins
: фильтруется наERROR
уровне и активен, только еслиDEBUG=False
.
Если вы не переопределяете ведение журнала Django по умолчанию, вы должны увидеть минимальные изменения в поведении, но, например, вы можете увидеть новое ведение журнала в runserver
консоли.
Если вы переопределяете ведение журнала Django по умолчанию, вам следует проверить, как ваша конфигурация объединяется с новыми значениями по умолчанию.
HttpRequest
подробности в отчете об ошибках ¶
Избыточно отображать полные сведения о
HttpRequest
каждом случае, когда он появлялся в виде переменной кадра стека в HTML-версии страницы отладки и сообщения об ошибке. Таким образом, HTTP-запрос теперь будет отображать то же стандартное представление, что и другие переменные ( repr(request)
). В результате
ExceptionReporterFilter.get_request_repr()
метод и недокументированная
django.http.build_request_repr()
функция были удалены.
Содержимое текстовой версии электронного письма было изменено, чтобы обеспечить отслеживание той же структуры, что и в случае запросов AJAX. Детали трассировки отображаются ExceptionReporter.get_traceback_text()
методом.
Удаление глобальных адаптеров и конвертеров с учетом часовых поясов для даты и времени ¶
Django больше не регистрирует глобальные адаптеры и преобразователи для управления информацией о часовых поясах для datetime
значений, отправляемых в базу данных в качестве параметров запроса или считываемых из базы данных в результатах запроса. Это изменение затрагивает проекты, отвечающие всем следующим условиям:
USE_TZ
УстановкаTrue
.- База данных - это SQLite, MySQL, Oracle или сторонняя база данных, которая не поддерживает часовые пояса. Если вы сомневаетесь, вы можете проверить значение
connection.features.supports_timezones
. - Код запрашивает базу данных вне ORM, обычно с
.
cursor.execute(sql, params)
Если вы передаете datetime
такие запросы осознанными параметрами, вы должны превратить их в наивные даты в формате UTC:
from django.utils import timezone
param = timezone.make_naive(param, timezone.utc)
Если вы этого не сделаете, преобразование будет выполнено, как и в более ранних версиях (с предупреждением об устаревании), вплоть до Django 1.11. Django 2.0 не выполняет никаких преобразований, что может привести к повреждению данных.
Если вы читаете datetime
значения из результатов, они будут наивными, а не осознанными. Вы можете компенсировать это следующим образом:
from django.utils import timezone
value = timezone.make_aware(value, timezone.utc)
Вам ничего из этого не понадобится, если вы запрашиваете базу данных через ORM, даже если вы используете raw()
запросы. ORM заботится об управлении информацией о часовых поясах.
Модули тегов шаблона импортируются при настройке шаблонов ¶
DjangoTemplates
Бэкенд в настоящее время выполняет обнаружение на установленных модулях тегов шаблона , когда экземпляр. Это обновление позволяет явно предоставлять библиотеки с помощью 'libraries'
ключа OPTIONS
при определении
DjangoTemplates
серверной части. Ошибки импорта или синтаксиса в модулях тегов шаблона теперь завершаются сбоем на раннем этапе создания экземпляра, а не при первой компиляции шаблона с тегом.{% load %}
django.template.base.add_to_builtins()
удален ¶
Хотя это был частный API, проекты обычно использовались add_to_builtins()
для предоставления тегов и фильтров шаблонов без использования
тега. Этот API формализован. Теперь проекты должны определять встроенные библиотеки с помощью ключа при определении
серверной части.{% load %}
'builtins'
OPTIONS
DjangoTemplates
simple_tag
теперь переносит вывод тегов в conditional_escape
¶
Как правило, теги шаблона не экранируют свое содержимое автоматически, и это поведение
задокументировано . Для таких тегов
inclusion_tag
это не проблема, потому что включенный шаблон будет выполнять автоматическое экранирование. For assignment_tag()
вывод будет экранирован, когда он используется в качестве переменной в шаблоне.
Однако для предполагаемых случаев использования simple_tag
очень легко получить неверный HTML и, возможно, использовать XSS-эксплойт. Например:
@register.simple_tag(takes_context=True)
def greeting(context):
return "Hello {0}!".format(context['request'].user.first_name)
В более старых версиях Django это будет проблемой XSS, потому что
user.first_name
она не устранена.
В Django 1.9 это исправлено: если контекст шаблона autoescape=True
установлен (по умолчанию), то simple_tag
вывод функции тега будет заключен в оболочку conditional_escape()
.
Чтобы исправить simple_tag
ошибки, лучше всего применить следующие методы:
- Любой код, генерирующий HTML, должен использовать либо систему шаблонов, либо
format_html()
. - Если вывод
simple_tag
требует экранирования, используйтеescape()
илиconditional_escape()
. - Если вы абсолютно уверены, что выводите HTML из надежного источника (например, из поля CMS, в котором хранится HTML, введенный администраторами), вы можете отметить его как таковой с помощью
mark_safe()
.
Теги, соответствующие этим правилам, будут правильными и безопасными независимо от того, запущены ли они в Django 1.9+ или более ранней версии.
Paginator.page_range
¶
Paginator.page_range
теперь итератор вместо списка.
В версиях Django до 1.8 Paginator.page_range
возвращал a
list
в Python 2 и a range
в Python 3. Django 1.8 последовательно возвращал список, но итератор более эффективен.
Существующий код, зависящий от list
определенных функций, таких как индексация, можно перенести путем преобразования итератора в list
using list()
.
Неявный QuerySet
__in
поиск удален ¶
В более ранних версиях такие запросы, как:
Model.objects.filter(related_id=RelatedModel.objects.all())
неявно преобразовал бы в:
Model.objects.filter(related_id__in=RelatedModel.objects.all())
в результате получается SQL вроде ."related_id IN (SELECT id FROM ...)"
Этого неявного __in
больше не происходит, поэтому «IN» SQL теперь имеет «=», и если подзапрос возвращает несколько результатов, по крайней мере некоторые базы данных выдадут ошибку.
contrib.admin
поддержка браузера ¶
Администратор больше не поддерживает Internet Explorer 8 и ниже, так как срок службы этих браузеров истек.
CSS и изображения для поддержки Internet Explorer 6 и 7 были удалены. Значки PNG и GIF были заменены значками SVG, которые не поддерживаются Internet Explorer 8 и более ранними версиями.
Библиотека jQuery, встроенная в админку, была обновлена с версии 1.11.2 до 2.1.4. jQuery 2.x имеет тот же API, что и jQuery 1.x, но не поддерживает Internet Explorer 6, 7 или 8, что обеспечивает лучшую производительность и меньший размер файла. Если вам нужна поддержка IE8 и вы также должны использовать последнюю версию Django, вы можете заменить админскую копию jQuery своей собственной, создав приложение Django с такой структурой:
app/static/admin/js/vendor/
jquery.js
jquery.min.js
SyntaxError
при установке Django setuptools 5.5.x ¶
При установке Django 1.9 или 1.9.1 с помощью setuptools 5.5.x вы увидите:
Compiling django/conf/app_template/apps.py ...
File "django/conf/app_template/apps.py", line 4
class {{ camel_case_app_name }}Config(AppConfig):
^
SyntaxError: invalid syntax
Compiling django/conf/app_template/models.py ...
File "django/conf/app_template/models.py", line 1
{{ unicode_literals }}from django.db import models
^
SyntaxError: invalid syntax
Эти ошибки можно игнорировать (Django все равно установится нормально), но вы можете избежать их, обновив setuptools до более новой версии. Если вы используете pip, вы можете обновить pip, используя который также обновит инструменты установки. Эта проблема решена в более поздних версиях Django, как описано в примечаниях к выпуску Django 1.9.2 .python -m pip install -U pip
Разное ¶
- Статические файлы jQuery
contrib.admin
перемещены вvendor/jquery
подкаталог. - Текст, отображаемый для пустых столбцов в
list_display
ячейках административного списка изменений, изменился с(None)
(или его переведенного эквивалента) на-
(тире). django.http.responses.REASON_PHRASES
иdjango.core.handlers.wsgi.STATUS_CODE_TEXT
были удалены. Вместо этого используйте Python stdlib:http.client.responses
для Python 3 и httplib.responses для Python 2.ValuesQuerySet
иValuesListQuerySet
были удалены.- В
admin/base.html
шаблоне больше не устанавливаетсяwindow.__admin_media_prefix__
илиwindow.__admin_utc_offset__
. Ссылки на изображения в JavaScript, которые использовали это значение для создания абсолютных URL-адресов, были перемещены в CSS для упрощения настройки. Смещение UTC хранится в атрибуте данных<body>
тега. CommaSeparatedIntegerField
Проверка была усовершенствована , чтобы запретить такие ценности , как','
,',1'
и'1,,2'
.- Инициализация формы перенесена из
ProcessFormView.get()
метода в новыйFormMixin.get_context_data()
метод. Это может быть обратно несовместимым, если вы переопределилиget_context_data()
метод без вызоваsuper()
. - Поддержка PostGIS 1.5 прекращена.
django.contrib.sites.models.Site.domain
Поле было изменено , чтобы бытьunique
.- Чтобы обеспечить изоляцию тестов, запросы к базе данных больше не разрешены по умолчанию в
SimpleTestCase
тестах. Вы можете отключить это поведение, установивallow_database_queries
атрибут class вTrue
свой тестовый класс. ResolverMatch.app_name
был изменен, чтобы содержать полный путь к пространству имен в случае вложенных пространств имен. Для согласованности сResolverMatch.namespace
пустым значением теперь является пустая строка вместоNone
.- Для усиления безопасности ключи сеанса должны содержать не менее 8 символов.
- Приватная функция
django.utils.functional.total_ordering()
удалена. Он содержал обходной путь дляfunctools.total_ordering()
ошибки в версиях Python старше 2.7.3. - Сериализация XML (через
dumpdata
или через структуру синдикации), используемая для вывода любых полученных символов. Теперь, если сериализуемый контент содержит какие-либо управляющие символы, не разрешенные стандартом XML 1.0, сериализация завершится ошибкой с расширениемValueError
. CharField
теперь по умолчанию удаляет ввод начальных и конечных пробелов. Это можно отключить, установив для новогоstrip
аргумента значениеFalse
.- Текст шаблона, который переведен и использует два или более последовательных знака процента, например
"%%"
, может иметь новыйmsgid
послеmakemessages
выполнения (скорее всего, перевод будет помечен как нечеткий). Новыйmsgid
будет отмечен ."#, python-format"
- Если ни
request.current_app
ниContext.current_app
не установлены,url
тег шаблона теперь будет использовать пространство имен текущего запроса. Установитеrequest.current_app
на ,None
если вы не хотите использовать пространство имен подсказки. SILENCED_SYSTEM_CHECKS
Установка в настоящее время заглушает сообщения всех уровней. РаньшеERROR
на консоль выводились сообщения уровня или выше.FlatPage.enable_comments
Поле удаляется из ,FlatPageAdmin
как он не используется приложением. Если ваш проект или стороннее приложение использует его, создайте собственный ModelAdmin, чтобы добавить его обратно.- Возвращаемое значение
setup_databases()
и первый аргументteardown_databases()
изменены. Раньше они были кортежами. Теперь это только первый элемент .(old_names, mirrors)
old_names
- По умолчанию
LiveServerTestCase
пытается найти доступный порт в диапазоне 8081-8179 вместо того, чтобы просто пробовать порт 8081. - Система проверяет
ModelAdmin
теперь экземпляры проверки, а не классы. - Частный API для применения смешанных планов миграции был удален из соображений производительности. Смешанные планы состоят из списка миграций, в которых одни применяются, а другие не применяются.
- Связанные классы дескрипторов объекта модели в
django.db.models.fields.related
(частный API) перемещаются изrelated
модуля вrelated_descriptors
и переименовываются следующим образом:ReverseSingleRelatedObjectDescriptor
являетсяForwardManyToOneDescriptor
SingleRelatedObjectDescriptor
являетсяReverseOneToOneDescriptor
ForeignRelatedObjectsDescriptor
являетсяReverseManyToOneDescriptor
ManyRelatedObjectsDescriptor
являетсяManyToManyDescriptor
- Если вы реализуете настраиваемое
handler404
представление, оно должно возвращать ответ с кодом состояния HTTP 404. ИспользуйтеHttpResponseNotFound
или переходитеstatus=404
наHttpResponse
. В противном случаеAPPEND_SLASH
не будет корректно работать сDEBUG=False
.
Функции, устаревшие в версии 1.9 ¶
assignment_tag()
¶
В Django 1.4 добавлен assignment_tag
помощник, упрощающий создание тегов шаблона, в которых результаты хранятся в переменной шаблона.
simple_tag()
Помощник приобрел такую же способность, что делает assignment_tag
устаревшими. Теги, которые используют,
assignment_tag
должны быть обновлены для использования simple_tag
.
{% cycle %}
синтаксис с аргументами, разделенными запятыми ¶
cycle
Тег поддерживает подчиненный старый синтаксис из предыдущих версий Django:
{% cycle row1,row2,row3 %}
Его синтаксический анализ вызвал ошибки с текущим синтаксисом, поэтому поддержка старого синтаксиса будет удалена в Django 1.10 после ускоренного прекращения поддержки.
ForeignKey
и OneToOneField
on_delete
аргумент ¶
Чтобы повысить осведомленность о каскадном удалении модели,
в Django 2.0 потребуется on_delete
аргумент ForeignKey
и OneToOneField
.
Обновите модели и существующие миграции, чтобы явно указать аргумент. Поскольку значение по умолчанию - models.CASCADE
добавить on_delete=models.CASCADE
ко всем
ForeignKey
и OneToOneField
s, которые не используют другой параметр. Вы также можете передать его как второй позиционный аргумент, если вас не волнует совместимость со старыми версиями Django.
Field.rel
изменения ¶
Field.rel
и его методы и атрибуты были изменены, чтобы соответствовать API связанных полей. Field.rel
Атрибут переименован remote_field
и многие из его методов и атрибутов, либо изменить или переименовать.
Цель этих изменений - предоставить документированный API для полей отношений.
GeoManager
и GeoQuerySet
пользовательские методы ¶
Все пользовательские GeoQuerySet
методы ( area()
, distance()
, gml()
...) были заменены эквивалентными географических выражений в аннотации (см новых функций). Следовательно, необходимость настраивать пользовательские GeoManager
модели для моделей с поддержкой ГИС теперь устарела. Как только ваш код не вызывает ни одного из устаревших методов, вы можете просто удалить строки из своих моделей.objects = GeoManager()
Изменились API загрузчика шаблонов ¶
Загрузчики шаблонов Django были обновлены, чтобы разрешить рекурсивное расширение шаблона. Это изменение потребовало нового API загрузчика шаблонов. Старые
load_template()
и load_template_sources()
методы в настоящее время не рекомендуется. Подробности о новом API можно найти в документации загрузчика шаблонов .
Передача 3-кортеж или app_name
к include()
¶
Часть пространства имен экземпляра при передаче кортежа в качестве аргумента include()
была заменена передачей namespace
аргумента в include()
. Например:
polls_patterns = [
url(...),
]
urlpatterns = [
url(r'^polls/', include((polls_patterns, 'polls', 'author-polls'))),
]
становится:
polls_patterns = ([
url(...),
], 'polls') # 'polls' is the app_name
urlpatterns = [
url(r'^polls/', include(polls_patterns, namespace='author-polls')),
]
app_name
Аргумент include()
был заменен путем пропускания 2-кортеж (как указано выше), или передавая объект или модуль с app_name
атрибутом (как показано ниже). Если app_name
установлено этим новым способом,
namespace
аргумент больше не требуется. По умолчанию будет установлено значение
app_name
. Например, шаблоны URL-адресов в руководстве изменены с:
urlpatterns = [
url(r'^polls/', include('polls.urls', namespace="polls")),
...
]
к:
urlpatterns = [
url(r'^polls/', include('polls.urls')), # 'namespace="polls"' removed
...
]
app_name = 'polls' # added
urlpatterns = [...]
Это изменение также означает, что старый способ включения AdminSite
экземпляра устарел. Вместо этого перейдите admin.site.urls
непосредственно к
django.conf.urls.url()
:
from django.conf.urls import url
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
]
Требуется пространство имен приложения URL, если задано пространство имен экземпляра ¶
В прошлом пространство имен экземпляра без пространства имен приложения служило той же цели, что и пространство имен приложения, но было невозможно изменить шаблоны, если существовало пространство имен приложения с тем же именем. Включения, которые определяют пространство имен экземпляра, требуют, чтобы включенный URLconf устанавливал пространство имен приложения.
current_app
параметр для contrib.auth
просмотров ¶
Все представления django.contrib.auth.views
имеют следующую структуру:
def view(request, ..., current_app=None, ...):
...
if current_app is not None:
request.current_app = current_app
return TemplateResponse(request, template_name, context)
Начиная с Django 1.8, current_app
устанавливается на request
объекте. Для обеспечения согласованности этих взглядов потребует абонента установить current_app
на
request
вместо того , чтобы передать его в отдельный аргумент.
django.contrib.gis.geoip
¶
В django.contrib.gis.geoip2
модуле аннулирует
django.contrib.gis.geoip
. Новый модуль предоставляет аналогичный API, за исключением того, что он не предоставляет устаревшие методы совместимости GeoIP-Python API.
Разное ¶
weak
Аргументdjango.dispatch.signals.Signal.disconnect()
является устаревшим , поскольку это не имеет никакого эффекта.- Этот
check_aggregate_support()
методdjango.db.backends.base.BaseDatabaseOperations
устарел и будет удален в Django 2.0.check_expression_support()
Вместо этого следует использовать более общие . django.forms.extras
устарел. Вы можете найтиSelectDateWidget
вdjango.forms.widgets
(или простоdjango.forms
) вместо этого.- Частный API
django.db.models.fields.add_lazy_relation()
устарел. django.contrib.auth.tests.utils.skipIfCustomUser()
Декоратор устарела. С изменениями обнаружения тестов в Django 1.6 тестыdjango.contrib
приложений больше не выполняются как часть проекта пользователя. Следовательно,@skipIfCustomUser
декоратор больше не нужен для оформления тестов вdjango.contrib.auth
.- Если вы настроили некоторые обработчики ошибок , подписи представления только с одним параметром запроса устарели. Представления теперь также должны принимать второй
exception
позиционный параметр. django.utils.feedgenerator.Atom1Feed.mime_type
Иdjango.utils.feedgenerator.RssFeed.mime_type
атрибуты являются устаревшими в пользуcontent_type
.Signer
теперь выдает предупреждение, если используется недопустимый разделитель. Это станет исключением в Django 1.10.django.db.models.Field._get_val_from_obj()
устарел в пользуField.value_from_object()
.django.template.loaders.eggs.Loader
устарел как распространяющие приложения, так как яйца не рекомендуется.callable_obj
Ключевое слово аргументSimpleTestCase.assertRaisesMessage()
является устаревшим. Вместо этого передайте вызываемый объект как позиционный аргумент.allow_tags
Атрибут методовModelAdmin
является устаревшим. Вместо этого используйтеformat_html()
,format_html_join()
илиmark_safe()
при построении возвращаемого значения метода.enclosure
Ключевое слово аргументSyndicationFeed.add_item()
является устаревшим. Используйте новыйenclosures
аргумент, который принимает списокEnclosure
объектов вместо одного.django.template.loader.LoaderOrigin
Иdjango.template.base.StringOrigin
псевдонимы дляdjango.template.base.Origin
осуждаются.
Функции, удаленные в 1.9 ¶
Эти функции достигли конца цикла устаревания и удалены в Django 1.9. См. Подробности в разделе « Функции, не рекомендуемые в версии 1.7» , в том числе о том, как отказаться от использования этих функций.
django.utils.dictconfig
устранен.django.utils.importlib
устранен.django.utils.tzinfo
устранен.django.utils.unittest
устранен.- Команда
syncdb
удалена. django.db.models.signals.pre_syncdb
иdjango.db.models.signals.post_syncdb
удаляется.- Поддержка
allow_syncdb
маршрутизаторов на базе данных удалена. - Убрана автоматическая синхронизация приложений без миграций. Миграция обязательна для всех приложений, если вы не передадите эту
опцию.
migrate --run-syncdb
- Команды управления SQL для приложений без миграции,
sql
,sqlall
,sqlclear
,sqldropindexes
, иsqlindexes
, удаляются. - Удалена поддержка автоматической загрузки
initial_data
фикстур и исходных данных SQL. - Все модели должны быть определены внутри установленного приложения или объявлены явным
app_label
. Кроме того, их невозможно импортировать до загрузки приложения. В частности, невозможно импортировать модели внутри корневого пакета приложения. - Модель и форма
IPAddressField
удалены. Поле-заглушка остается для совместимости с историческими миграциями. AppCommand.handle_app()
больше не поддерживается.RequestSite
иget_current_site()
больше не импортируются изdjango.contrib.sites.models
.- Поддержка FastCGI через команду
runfcgi
управления удалена. django.utils.datastructures.SortedDict
устранен.ModelAdmin.declared_fieldsets
устранен.- Удаляются
util
модули, обеспечивающие обратную совместимость:django.contrib.admin.util
django.contrib.gis.db.backends.util
django.db.backends.util
django.forms.util
ModelAdmin.get_formsets
устранен.- Прокладки с обратной совместимостью, введенные для переименования
BaseMemcachedCache._get_memcache_timeout()
метода,get_backend_timeout()
удалены. --natural
И-n
опции дляdumpdata
удаляются.use_natural_keys
Аргументserializers.serialize()
удаляется.- Частный API
django.forms.forms.get_declared_fields()
удален. - Возможность использовать
SplitDateTimeWidget
withDateTimeField
удалена. WSGIRequest.REQUEST
Свойство удаляется.- Класс
django.utils.datastructures.MergeDict
удален. zh-cn
Иzh-tw
языковые коды удаляются.- Внутреннее
django.utils.functional.memoize()
удалено. django.core.cache.get_cache
устранен.django.db.models.loading
устранен.- Передача вызываемых аргументов в наборы запросов больше невозможна.
BaseCommand.requires_model_validation
удаляется в пользуrequires_system_checks
. Админ-валидаторы заменены админскими проверками.ModelAdmin.validator_class
Иdefault_validator_class
атрибуты удалены.ModelAdmin.validate()
устранен.django.db.backends.DatabaseValidation.validate_field
удален в пользуcheck_field
метода.- Команда
validate
управления удалена. django.utils.module_loading.import_by_path
удаляется в пользуdjango.utils.module_loading.import_string
.ssi
иurl
теги шаблонов удаляются изfuture
библиотеки тегов шаблонов.django.utils.text.javascript_quote()
устранен.- Параметры теста базы данных как независимые записи в параметрах базы данных с префиксом
TEST_
, больше не поддерживаются. cache_choices
ВариантModelChoiceField
иModelMultipleChoiceField
удаляется.- Значение
RedirectView.permanent
атрибута по умолчанию изменено сTrue
наFalse
. django.contrib.sitemaps.FlatPageSitemap
удаляется в пользуdjango.contrib.flatpages.sitemaps.FlatPageSitemap
.- Частный API
django.test.utils.TestTemplateLoader
удален. django.contrib.contenttypes.generic
Модуль удаляется.