Примечания к выпуску Django 1.1¶
Апрель 4, 2017
Добро пожаловать в Django 1.1!
Эти заметки о выпуске охватывают new features, а также некоторые backwards incompatible changes, о которых вы должны знать при переходе с Django 1.10 или более старых версий. Мы begun the deprecation process for some features.
См. руководство Как обновить Django до более новой версии, если вы обновляете существующий проект.
Django 2.2 обозначен как long-term support release. Она будет получать обновления безопасности в течение как минимум трех лет после выпуска. Поддержка предыдущей LTS, Django 1.11, закончится в апреле 2020 года.
Совместимость с Python¶
Django 1.11 требует Python 2.7, 3.4, 3.5, 3.6 или 3.7 (по состоянию на 1.11.17). Мы настоятельно рекомендуем и официально поддерживаем только последний выпуск каждой серии.
Серия Django 1.11.x является последней, поддерживающей Python 2. Следующий основной выпуск, Django 2.0, будет поддерживать только Python 3.4+.
Амортизирующие предупреждения больше не являются громкими по умолчанию¶
В отличие от старых версий Django, собственные предупреждения об износе в Django больше не отображаются по умолчанию. Это соответствует поведению Python по умолчанию.
Это изменение позволяет сторонним приложениям поддерживать как Django 1.11 LTS, так и Django 1.8 LTS без необходимости добавлять код, чтобы избежать предупреждений об устаревании.
После выхода Django 2.0 мы предлагаем авторам сторонних приложений отказаться от поддержки всех версий Django, предшествующих 1.11. В это время вы должны иметь возможность запускать тесты вашего пакета, используя python -Wd, чтобы предупреждения об устаревании не появлялись. После исправления предупреждений об устаревании ваше приложение должно быть совместимо с Django 2.0.
Что нового в Django 1.1¶
Модельные индексы на основе классов¶
Новый модуль django.db.models.indexes содержит классы, облегчающие создание индексов базы данных. Индексы добавляются к моделям с помощью опции Meta.indexes.
Класс Index создает индекс b-дерева, как если бы вы использовали db_index на поле модели или index_together на модели Meta. Он может быть подклассифицирован для поддержки различных типов индексов, например GinIndex. Он также позволяет определить порядок (ASC/DESC) для столбцов индекса.
Рендеринг виджетов на основе шаблонов¶
Чтобы облегчить настройку виджетов, рендеринг виджетов формы теперь осуществляется с помощью системы шаблонов, а не на языке Python. См. API рендеринга форм.
Возможно, вам потребуется настроить все пользовательские виджеты, которые вы написали для нескольких backwards incompatible changes.
Subquery выражения¶
Новые выражения базы данных Subquery и Exists позволяют создавать явные подзапросы. Подзапросы могут ссылаться на поля из внешнего набора запросов с помощью класса OuterRef.
Незначительные особенности¶
django.contrib.admin¶
ModelAdmin.date_hierarchyтеперь может ссылаться на поля в разных отношениях.- Новый хук
ModelAdmin.get_exclude()позволяет указать исключаемые поля на основе запроса или экземпляра модели. - Шаблон
popup_response.htmlтеперь можно переопределить для каждого приложения, для каждой модели или путем установки атрибутаModelAdmin.popup_response_template.
django.contrib.auth¶
- Количество итераций по умолчанию для хешера паролей PBKDF2 увеличено на 20%.
- Представления
LoginViewиLogoutViewна основе классов заменяют устаревшие представленияlogin()иlogout()на основе функций. - Представления на основе классов
PasswordChangeView,PasswordChangeDoneView,PasswordResetView,PasswordResetDoneView,PasswordResetConfirmViewиPasswordResetCompleteViewзаменяют устаревшие представления на основе функцийpassword_change(),password_change_done(),password_reset(),password_reset_done(),password_reset_confirm()иpassword_reset_complete(). - Новый атрибут
post_reset_loginдляPasswordResetConfirmViewпозволяет автоматически регистрировать пользователя после успешного сброса пароля. Если у вас настроено несколькоAUTHENTICATION_BACKENDS, используйте атрибутpost_reset_login_backend, чтобы выбрать, какой из них использовать. - Чтобы избежать возможности утечки маркера сброса пароля через заголовок HTTP Referer (например, если страница сброса включает ссылку на CSS или JavaScript, размещенные на другом домене),
PasswordResetConfirmView(но не устаревшее представление на основе функцииpassword_reset_confirm()) хранит маркер в сессии и перенаправляет на себя, чтобы представить пользователю форму изменения пароля без маркера в URL. update_session_auth_hash()теперь поворачивает сессионный ключ, чтобы смена пароля могла аннулировать украденные сессионные куки.- Новый атрибут
success_url_allowed_hostsдляLoginViewиLogoutViewпозволяет указать набор хостов, безопасных для перенаправления после входа и выхода из системы. - Добавлены валидаторы паролей
help_textкUserCreationForm. - Теперь
HttpRequestпередается вauthenticate(), который в свою очередь передает его бэкенду аутентификации, если он принимает аргументrequest. - Сигнал
user_login_failed()теперь принимает аргументrequest. PasswordResetFormподдерживает пользовательские модели пользователей, которые используют поле электронной почты с именем, отличным от'email'. УстановитеCustomUser.EMAIL_FIELDна имя поля.get_user_model()теперь можно вызывать во время импорта, даже в модулях, определяющих модели.
django.contrib.contenttypes¶
- При обнаружении устаревших типов содержимого в команде
remove_stale_contenttypesтеперь есть список связанных объектов, таких какauth.Permissions, которые также будут удалены. Ранее перечислялись только типы содержимого (и эта подсказка была послеmigrate, а не в отдельной команде).
django.contrib.gis¶
- Новые методы
GEOSGeometry.from_gml()иOGRGeometry.from_gml()позволяют создавать геометрии из GML. - Добавлена поддержка поиска
dwithinв SpatiaLite. - Функция
Area, функцияDistanceи поиск расстояний теперь работают с геодезическими координатами на SpatiaLite. - Виджеты форм на основе OpenLayers теперь используют
OpenLayers.jsизhttps://cdnjs.cloudflare.com, что более подходит для производственного использования, чем старый источникhttps://openlayers.org/. Они также обновлены для использования OpenLayers 3. - Миграции PostGIS теперь могут изменять размеры полей.
- Добавлена возможность передавать параметры
size,shapeиoffsetпри создании объектовGDALRaster. - Добавлена поддержка SpatiaLite для функции
IsValid, функцииMakeValidи поискаisvalid. - Добавлена поддержка Oracle для функции
AsGML,BoundingCircle,IsValidиisvalid.
django.contrib.postgres¶
- Новый аргумент
distinctдляArrayAggопределяет, будут ли конкатенированные значения различаться. - Новые классы
GinIndexиBrinIndexпозволяют создаватьGINиBRINиндексы в базе данных. django.contrib.postgres.fields.JSONFieldпринимает новый параметрencoderдля указания пользовательского класса для кодирования типов данных, не поддерживаемых стандартным кодировщиком.- Новый миксин
CITextи операция миграцииCITextExtensionпозволяют использовать расширение PostgreSQLcitextдля поиска без учета регистра. Предусмотрено три поля:CICharField,CIEmailFieldиCITextField. - Новый
JSONBAggпозволяет агрегировать значения в виде массива JSON. HStoreField(поле модели) иHStoreField(поле формы) позволяют хранить нулевые значения.
Кэш¶
- Бэкенды Memcached теперь передают содержимое
OPTIONSв качестве аргументов ключевых слов в конструкторы клиента, что позволяет более детально контролировать поведение клиента. Примеры смотрите в документации по cache arguments. - Бэкенды Memcached теперь позволяют определять несколько серверов в виде строки, разделенной запятыми в
LOCATION, для удобства работы со сторонними сервисами, которые используют такие строки в переменных окружения.
CSRF¶
- Добавлена настройка
CSRF_USE_SESSIONS, позволяющая хранить CSRF-токен в сессии пользователя, а не в cookie.
Бэкенды баз данных¶
- Добавлен аргумент
skip_lockedкQuerySet.select_for_update()на PostgreSQL 9.5+ и Oracle для выполнения запросов сFOR UPDATE SKIP LOCKED. - Добавлена настройка
TEST['TEMPLATE'], позволяющая пользователям PostgreSQL указывать шаблон для создания тестовой базы данных. QuerySet.iterator()теперь использует server-side cursors на PostgreSQL. Эта функция переносит часть нагрузки рабочей памяти (используемой для хранения результатов запросов) на базу данных и может увеличить использование памяти базы данных.- Добавлена поддержка MySQL для опции
'isolation_level'вOPTIONS, позволяющая указывать transaction isolation level. Чтобы избежать возможной потери данных, рекомендуется перейти с уровня по умолчанию MySQL, повторяющееся чтение, на чтение с фиксацией. - Добавлена поддержка
cx_Oracle5.3.
Електронна пошта¶
- Добавлена настройка
EMAIL_USE_LOCALTIME, позволяющая отправлять заголовки даты SMTP в местном часовом поясе, а не в UTC. EmailMessage.attach()иattach_file()теперь возвращаются к MIME-типу application/octet-stream, когда двоичное содержимое, которое не может быть декодировано как UTF-8, указано для вложения text/*.
Хранение файлов¶
- Чтобы сделать его оборачиваемым
io.TextIOWrapper,Fileтеперь имеет методыreadable(),writable()иseekable().
Формы¶
- Новый атрибут
empty_valueдляCharField,EmailField,RegexField,SlugFieldиURLFieldпозволяет указать значение Python для представления «пусто». - Новый метод
Form.get_initial_for_field()возвращает начальные данные для поля формы.
Интернационализация¶
- Форматирование чисел и настройка
NUMBER_GROUPINGподдерживают неравномерную группировку цифр.
Команды управления¶
- Новая опция
loaddata --excludeпозволяет исключить модели и приложения при загрузке данных из приспособлений. - Новая опция
diffsettings --defaultпозволяет указать модуль настроек, отличный от настроек Django по умолчанию, с которым будет проводиться сравнение. - Аргументы
app_labels теперь ограничивают выводshowmigrations --plan.
Миграции¶
- Добавлена поддержка сериализации объектов
uuid.UUID.
Модели¶
- Добавлена поддержка вызываемых значений в аргументе
defaultsвQuerySet.update_or_create()иget_or_create(). ImageFieldтеперь имеет валидатор по умолчаниюvalidate_image_file_extension. (Этот валидатор переместился в поле формы в Django 1.11.2).- В функции
Truncдобавлена поддержка усечения времени. - Добавлена функция
ExtractWeekдля извлечения недели изDateFieldиDateTimeFieldи выставления ее через поискweek. - Добавлена функция
TruncTimeдля усеченияDateTimeFieldдо его временной составляющей и раскрытия его через поискtime. - Добавлена поддержка выражений в
QuerySet.values()иvalues_list(). - Добавлена поддержка выражений запросов для поиска, принимающих несколько аргументов, таких как
range. - Теперь вы можете использовать опцию
unique=TrueсFileField. - Добавлены параметры
nulls_firstиnulls_lastкExpression.asc()иdesc()для управления упорядочиванием нулевых значений. - Новые методы
Fвыраженияbitleftshift()иbitrightshift()позволяют bitwise shift operations. - Добавлены
QuerySet.union(),intersection()иdifference().
Запросы и ответы¶
- Добавлено
QueryDict.fromkeys(). CommonMiddlewareтеперь устанавливает заголовок ответаContent-Lengthдля непотоковых ответов.- Добавлен параметр
SECURE_HSTS_PRELOAD, позволяющий добавлять директивуpreloadк заголовкуStrict-Transport-Security. ConditionalGetMiddlewareтеперь добавляет заголовокETagк ответам.
Сериализация¶
- Новый атрибут
django.core.serializers.base.Serializer.stream_classпозволяет подклассам настраивать поток по умолчанию. - Кодер, используемый JSON serializer, теперь можно настроить, передав аргумент с ключевым словом
clsв функциюserializers.serialize(). DjangoJSONEncoderтеперь сериализует объектыtimedelta(используемыеDurationField).
Шаблоны¶
mark_safe()теперь можно использовать в качестве декоратора.- Бэкенд шаблона
Jinja2теперь поддерживает контекстные процессоры путем установки опции'context_processors'вOPTIONS. - Тег
regroupтеперь возвращаетnamedtuples вместо словарей, поэтому вы можете распаковывать объект группы непосредственно в цикле, например,{% for grouper, list in regrouped %}. - Добавлен тег шаблона
resetcycle, позволяющий сбросить последовательность тега шаблонаcycle. - Теперь вы можете указать конкретные каталоги для определенного
filesystem.Loader.
Тесты¶
- Добавлено
DiscoverRunner.get_test_runner_kwargs()для настройки аргументов ключевых слов, передаваемых программе запуска тестов. - Добавлена опция
test --debug-modeдля помощи в устранении неисправностей при тестировании путем установки параметраDEBUGв значениеTrue. - Новые функции
django.test.utils.setup_databases()(перенесены изdjango.test.runner) иteardown_databases()облегчают создание пользовательских прогонов тестов. - Добавлена поддержка
unittest.TestCase.subTest()при использовании опцииtest --parallel. DiscoverRunnerтеперь запускает системные проверки в начале выполнения теста. Переопределите методDiscoverRunner.run_checks(), если вы хотите отключить его.
Валидаторы¶
- Добавлено
FileExtensionValidatorдля проверки расширений файлов иvalidate_image_file_extensionдля проверки файлов изображений.
Изменения в 1.11, несовместимые с обратными изменениями¶
django.contrib.gis¶
- Для упрощения кодовой базы и потому, что его легче установить, чем когда
contrib.gisбыл впервые выпущен, GDAL теперь является обязательной зависимостью для GeoDjango. В старых версиях она требовалась только для SQLite. contrib.gis.mapsудален, поскольку он взаимодействует с устаревшей версией API Google Maps и, похоже, не поддерживается. Если вы используете его, let us know.- Оператор равенства
GEOSGeometryтеперь также сравнивает SRID. - Виджеты форм на основе OpenLayers теперь используют OpenLayers 3, а шаблоны
gis/openlayers.htmlиgis/openlayers-osm.htmlбыли обновлены. Проверьте свой проект, если вы используете подклассы этих виджетов или расширяете шаблоны. Кроме того, новые виджеты работают немного иначе, чем старые. Вместо использования панели инструментов в виджете, вы нажимаете кнопку мыши, чтобы нарисовать, нажимаете и перетаскиваете, чтобы переместить карту, и нажимаете и перетаскиваете точку/вершину/угол, чтобы переместить ее. - Поддержка SpatiaLite < 4.0 прекращена.
- Поддержка GDAL 1.7 и 1.8 прекращена.
- Виджеты в
contrib.gis.forms.widgetsи админкеOpenLayersWidgetиспользуют form rendering API, а неloader.render_to_string(). Если вы используете собственный шаблон виджета, вам нужно убедиться, что ваш рендерер формы может его найти. Например, вы можете использовать рендерерTemplatesSetting.
django.contrib.staticfiles¶
collectstaticтеперь может не сработать во время постобработки при использовании хэшированного статического хранилища файлов, если существует цикл ссылок (например,'foo.css'ссылается на'bar.css', который сам ссылается на'foo.css') или если цепочка файлов, ссылающихся на другие файлы, слишком глубока, чтобы разрешить ее за несколько проходов. В последнем случае увеличьте количество проходов, используяManifestStaticFilesStorage.max_post_process_passes.- При использовании
ManifestStaticFilesStorageстатические файлы, не найденные в манифесте во время выполнения, теперь вызывают ошибкуValueErrorвместо возврата неизмененного пути. Вы можете вернуться к старому поведению, установивManifestStaticFilesStorage.manifest_strictвFalse.
API бэкенда базы данных¶
В этом разделе описаны изменения, которые могут потребоваться в бэкендах баз данных сторонних производителей.
- Метод
DatabaseOperations.time_trunc_sql()добавлен для поддержки усеченияTimeField. Он принимает аргументыlookup_typeиfield_nameи возвращает соответствующий SQL для усечения заданного поля времениfield_nameдо объекта времени с заданной спецификой. Аргументlookup_typeможет быть либо'hour','minute', либо'second'. - Метод
DatabaseOperations.datetime_cast_time_sql()добавлен для поддержки поискаtime. Он принимает аргументыfield_nameиtznameи возвращает SQL, необходимый для приведения значения datetime к значению времени. - Чтобы включить поддержку
FOR UPDATE SKIP LOCKED, установите значениеDatabaseFeatures.has_select_for_update_skip_locked = True. - Новый атрибут
DatabaseFeatures.supports_index_column_orderingуказывает, позволяет ли база данных определять порядок для столбцов в индексах. Значение по умолчаниюTrue, и методDatabaseIntrospection.get_constraints()должен включать ключ'orders'в каждый из возвращаемых словарей со списком значений'ASC'и/или'DESC', соответствующих упорядочению каждого столбца в индексе. inspectdbбольше не вызываетDatabaseIntrospection.get_indexes(), который является устаревшим. Пользовательские бэкенды баз данных должны убедиться, что все типы индексов возвращаютсяDatabaseIntrospection.get_constraints().- Переименовали функцию
ignores_quoted_identifier_caseвignores_table_name_case, чтобы более точно отразить ее использование. - Аргумент с ключевым словом
nameдобавлен в методDatabaseWrapper.create_cursor(self, name=None), чтобы позволить использовать курсоры на стороне сервера на бэкендах, которые это поддерживают.
Прекращена поддержка PostgreSQL 9.2 и PostGIS 2.0¶
Поддержка PostgreSQL 9.2 заканчивается в сентябре 2017 года. Как следствие, Django 1.11 устанавливает PostgreSQL 9.3 в качестве минимальной версии, которую он официально поддерживает.
Поддержка PostGIS 2.0 также удалена, поскольку PostgreSQL 9.2 является последней версией, поддерживающей его.
Кроме того, минимальная поддерживаемая версия psycopg2 увеличена с 2.4.5 до 2.5.4.
LiveServerTestCase привязывается к нулевому порту¶
Вместо того чтобы брать диапазон портов и итеративно искать свободный порт, LiveServerTestCase привязывается к нулевому порту и полагается на то, что операционная система назначит свободный порт. Переменная окружения DJANGO_LIVE_TEST_SERVER_ADDRESS больше не используется, и поскольку она также больше не используется, опция manage.py test --liveserver удалена.
Если вам нужно привязать LiveServerTestCase к определенному порту, используйте атрибут port, добавленный в Django 1.11.2.
Защита от небезопасных перенаправлений в представлениях django.contrib.auth и i18n¶
LoginView, LogoutView (и устаревшие эквиваленты на основе функций) и set_language() защищают пользователей от перенаправления на URL, не относящиеся к HTTPS next, когда приложение работает через HTTPS.
QuerySet.get_or_create() и update_or_create() проверяют аргументы¶
Чтобы предотвратить молчаливое прохождение опечаток, get_or_create() и update_or_create() проверяют, что их аргументы являются полями модели. Это должно быть обратно несовместимо только в том смысле, что это может выявить ошибку в вашем проекте.
pytz является необходимой зависимостью, а поддержка settings.TIME_ZONE = None удалена¶
Чтобы упростить работу Django с часовыми поясами, pytz теперь является обязательной зависимостью. Она автоматически устанавливается вместе с Django.
Поддержка settings.TIME_ZONE = None удалена, так как это поведение не часто используется и сомнительно полезно. Если вы хотите автоматически определять часовой пояс на основе системного часового пояса, вы можете использовать tzlocal:
from tzlocal import get_localzone
TIME_ZONE = get_localzone().zone
Это работает аналогично settings.TIME_ZONE = None, за исключением того, что он также устанавливает os.environ['TZ']. Let us know, если возникнет ситуация, когда вы обнаружите, что не можете адаптировать свой код для установки TIME_ZONE.
Изменения HTML в шаблонах администратора¶
<p class="help"> заменяется тегом <div>, что позволяет включать списки в текст справки.
Поля только для чтения обернуты в <div class="readonly">...</div> вместо <p>...</p>, что позволяет использовать любой вид HTML в качестве содержимого поля.
Изменения, связанные с внедрением рендеринга виджетов на основе шаблонов¶
Удалены некоторые недокументированные классы в django.forms.widgets:
SubWidgetRendererMixin,ChoiceFieldRenderer,RadioFieldRenderer,CheckboxFieldRendererChoiceInput,RadioChoiceInput,CheckboxChoiceInput
Недокументированный метод Select.render_option() удален.
Метод Widget.format_output() удален. Вместо него используйте пользовательский шаблон виджета.
Некоторые значения виджетов, такие как опции <select>, теперь локализуются при settings.USE_L10N=True. Вы можете вернуться к старому поведению с помощью пользовательских шаблонов виджетов, которые используют тег шаблона localize для отключения локализации.
django.template.backends.django.Template.render() запрещает недиктовый контекст¶
Для совместимости с различными шаблонизаторами, django.template.backends.django.Template.render() (возвращаемый из высокоуровневых API загрузчика шаблонов, таких как loader.get_template()) должен получать словарь контекста, а не Context или RequestContext. Если вы передавали один из этих двух классов, передайте вместо него словарь - это обеспечивает обратную совместимость со старыми версиями Django.
Изменение состояния модели в операциях миграции¶
Для повышения скорости применения миграций рендеринг связанных моделей откладывается до операции, которая в них нуждается (например, RunPython). Если у вас есть пользовательская операция, которая работает с классами моделей или экземплярами моделей из аргумента from_state в database_forwards() или database_backwards(), вы должны отрисовывать состояния модели с помощью метода clear_delayed_apps_cache(), как описано в writing your own migration operation.
Курсоры на стороне сервера в PostgreSQL¶
Изменение, заставляющее QuerySet.iterator() использовать серверные курсоры на PostgreSQL, не позволяет запустить Django с PgBouncer в режиме пула транзакций. Чтобы разрешить это, используйте параметр DISABLE_SERVER_SIDE_CURSORS (добавленный в Django 1.11.1) в DATABASES.
Более подробное обсуждение см. в разделе Объединение транзакций и курсоры на стороне сервера.
Разное¶
Если ни один элемент в ленте не имеет атрибута
pubdateилиupdateddate,SyndicationFeed.latest_post_date()теперь возвращает текущую дату/время UTC, а не время без информации о часовом поясе.Сбои CSRF регистрируются в журнале
django.security.csrfвместоdjango.request.Валидация
ALLOWED_HOSTSбольше не отключается при запуске тестов. Если ваше приложение включает тесты с пользовательскими именами хостов, вы должны включить эти имена хостов вALLOWED_HOSTS. См. раздел Тесты и несколько имен хостов.Использование id внешнего ключа (например,
'field_id') вModelAdmin.list_displayотображает ID связанного объекта. Удалите суффикс_id, если вы хотите получить старое поведение строкового представления объекта.В формах моделей
CharFieldсnull=Trueтеперь сохраняетNULLдля пустых значений вместо пустых строк.В Oracle,
Model.validate_unique()больше не проверяет пустые строки на уникальность, так как база данных интерпретирует значение какNULL.Если вы подкласс
AbstractUserи переопределяетеclean(), убедитесь, что он вызываетsuper().BaseUserManager.normalize_email()вызывается в новом методеAbstractUser.clean(), чтобы нормализация применялась в таких случаях, как проверка формы модели.EmailFieldиURLFieldбольше не принимают аргумент в виде ключевого словаstrip. Удалите его, потому что он не имеет эффекта в старых версиях Django, так как эти поля всегда обрезают пробельные символы.Атрибуты
checkedиselected, отображаемые виджетами форм, теперь используют синтаксис HTML5 boolean, а не XHTMLchecked='checked'иselected='selected'.RelatedManager.add(),remove(),clear()иset()теперь очищают кэшprefetch_related().Чтобы предотвратить возможную потерю сохраненных настроек,
setup_test_environment()теперь вызывает исключение, если вызывается во второй раз до вызоваteardown_test_environment().Недокументированный псевдоним
DateTimeAwareJSONEncoderдляDjangoJSONEncoder(переименованный в Django 1.0) удален.Теперь
cached template loaderвключается, еслиOPTIONS['loaders']не указан, аOPTIONS['debug']-False(последний параметр по умолчанию имеет значениеDEBUG). Это может быть обратно несовместимо, если у вас есть некоторые template tags that aren’t thread safe.После выполнения команды
migrateбольше не появляется запрос на удаление устаревшего типа содержимого. Вместо нее используйте новую командуremove_stale_contenttypes.Виджет администратора для
IntegerFieldиспользуетtype="number", а неtype="text".Условные HTTP-заголовки теперь анализируются и сравниваются в соответствии со спецификацией RFC 7232 условных запросов, а не со старой RFC 2616.
patch_response_headers()больше не добавляет заголовокLast-Modified. Согласно RFC 7234#section-4.2.2, этот заголовок бесполезен наряду с другими заголовками кэширования, которые предоставляют явное время истечения срока действия, напримерExpiresилиCache-Control.UpdateCacheMiddlewareиadd_never_cache_headers()вызываютpatch_response_headers()и поэтому также затронуты этим изменением.В шаблонах администратора тег
<p class="help">заменен на<div>, что позволяет включать списки в текст справки.ConditionalGetMiddlewareбольше не устанавливает заголовокDate, поскольку веб-серверы устанавливают этот заголовок. Он также больше не устанавливает заголовокContent-Length, поскольку теперь это делаетCommonMiddleware.Если у вас есть промежуточное ПО, которое изменяет содержимое ответа и появляется перед
CommonMiddlewareв настройкахMIDDLEWAREилиMIDDLEWARE_CLASSES, вы должны перестроить ваше промежуточное ПО так, чтобы ответы не изменялись после установкиContent-Length, или заставить промежуточное ПО, изменяющее ответ, сбросить заголовокContent-Length.get_model()иget_models()теперь вызываютAppRegistryNotReady, если они вызваны до того, как модели всех приложений были загружены. Ранее они требовали загрузки только моделей целевого приложения и, таким образом, могли возвращать модели без всех установленных отношений. Если вам нужно старое поведениеget_model(), установите аргументrequire_readyв значениеFalse.Неиспользуемый атрибут
BaseCommand.can_import_settingsудаляется.Недокументированный
django.utils.functional.lazy_propertyудален.Для согласованности с запросами, не состоящими из нескольких частей,
MultiPartParser.parse()теперь оставляетrequest.POSTнеизменяемым. Если вы изменяетеQueryDict, вы должны сначала скопировать его, например,request.POST.copy().Удалена поддержка
cx_Oracle< 7.0.Из команды
shellудалена поддержка IPython < 1.0.Подпись частного API
Widget.build_attrs()изменена сextra_attrs=None, **kwargsнаbase_attrs, extra_attrs=None.Файлоподобные объекты (например,
StringIOиBytesIO), загруженные вImageFieldс помощью тестового клиента, теперь требуют атрибутаnameсо значением, которое проходит валидаторvalidate_image_file_extension. См. примечание вClient.post().FileFieldтеперь перемещает, а не копирует полученный файл. При настройках загрузки файлов по умолчанию файлы размером болееFILE_UPLOAD_MAX_MEMORY_SIZEтеперь имеют те же разрешения, что и временные файлы (часто0o600), а не стандартный umask системы (часто0o6644). УстановитеFILE_UPLOAD_PERMISSIONS, если вам нужно одинаковое разрешение независимо от размера файла.
Функции, устаревшие в версии 1.1¶
models.permalink() декоратор¶
Вместо этого используйте django.urls.reverse(). Например:
from django.db import models
class MyModel(models.Model):
...
@models.permalink
def url(self):
return ('guitarist_detail', [self.slug])
становится:
from django.db import models
from django.urls import reverse
class MyModel(models.Model):
...
def url(self):
return reverse('guitarist_detail', args=[self.slug])
Разное¶
- <<<Представления
contrib.authна основе функцийlogin()иlogout()устарели в пользу новых представлений на основе классовLoginViewиLogoutView. - Неиспользуемый параметр
extra_contextвcontrib.auth.views.logout_then_login()является устаревшим. - Функциональные представления
contrib.authpassword_change(),password_change_done(),password_reset(),password_reset_done(),password_reset_confirm()иpassword_reset_complete()устарели в пользу новых представленийPasswordChangeView,PasswordChangeDoneView,PasswordResetView,PasswordResetDoneView,PasswordResetConfirmViewиPasswordResetCompleteView. django.test.runner.setup_databases()перемещается вdjango.test.utils.setup_databases(). Старое расположение устарело.django.utils.translation.string_concat()устарел в пользуdjango.utils.text.format_lazy().string_concat(*strings)может быть заменен наformat_lazy('{}' * len(strings), *strings).- Для бэкенда кэша
PyLibMCCacheпередача параметров поведенияpylibmcв качестве атрибутов верхнего уровня вOPTIONSустарела. Вместо этого задайте их под ключомbehaviorsвнутриOPTIONS. - Параметр
hostвdjango.utils.http.is_safe_url()устарел в пользу нового параметраallowed_hosts. - Глушение исключений, возникающих при рендеринге тега шаблона
{% include %}, устарело, поскольку такое поведение часто скорее запутывает, чем помогает. В Django 2.1 исключение будет подниматься. DatabaseIntrospection.get_indexes()устарел в пользуDatabaseIntrospection.get_constraints().authenticate()теперь передает аргументrequestв методauthenticate()бэкендов аутентификации. Поддержка методов, которые не принимаютrequestв качестве первого позиционного аргумента, будет удалена в Django 2.1.- Настройка
USE_ETAGSустарела в пользуConditionalGetMiddleware, которая теперь добавляет заголовокETagк ответам независимо от настройки.CommonMiddlewareиdjango.utils.cache.patch_response_headers()больше не будут устанавливать ETags, когда устаревание закончится. Model._meta.has_auto_fieldустарел в пользу проверки наличияModel._meta.auto_field is not None.- Использование групп регулярных выражений с
iLmsu#вurl()является неактуальным. Единственной полезной группой является(?i)для URL, не чувствительных к регистру, однако URL, не чувствительные к регистру, не являются хорошей практикой, поскольку они создают множество записей, например, для поисковых систем. Альтернативным решением может быть созданиеhandler404, который ищет в URL символы верхнего регистра и перенаправляет на эквивалент в нижнем регистре. - Аргумент
rendererдобавляется к методуWidget.render(). Методы, не принимающие этот аргумент, будут работать через период устаревания.