Примечания к выпуску Django 1.10 ¶
1 августа 2016 г.
Добро пожаловать в Django 1.10!
Эти примечания к выпуску охватывают новые функции , а также некоторые обратно несовместимые изменения, о которых вам нужно знать при обновлении с Django 1.9 или более старых версий. Мы отказались от некоторых функций , срок действия которых подошел к концу, и мы начали процесс прекращения поддержки некоторых функций .
См. Руководство по обновлению Django до более новой версии, если вы обновляете существующий проект.
Совместимость с Python ¶
Как и Django 1.9, Django 1.10 требует Python 2.7, 3.4 или 3.5. Мы настоятельно рекомендуем и официально поддерживаем только последний выпуск каждой серии.
Что нового в Django 1.10 ¶
Полнотекстовый поиск для PostgreSQL ¶
django.contrib.postgres
теперь включает набор функций базы данных, позволяющий использовать систему полнотекстового поиска. Вы можете выполнять поиск по нескольким полям в своей реляционной базе данных, комбинировать поиски с другими поисками, использовать разные языковые конфигурации и веса, а также ранжировать результаты по релевантности.
Кроме того , в настоящее время включает в себя поддержку триграммы, используя trigram_similar
поиск, а TrigramSimilarity
и
TrigramDistance
выражение.
Промежуточное ПО нового стиля ¶
Введен новый стиль промежуточного программного обеспечения, чтобы решить проблему отсутствия строгого разделения на уровни запросов / ответов старого стиля промежуточного программного обеспечения, описанного в DEP 0005 . Вам нужно будет адаптировать старое настраиваемое промежуточное ПО и переключиться сMIDDLEWARE_CLASSES
настройки на новую,MIDDLEWARE
чтобы воспользоваться улучшениями.
Официальная поддержка имен пользователей Unicode ¶
User
Модель django.contrib.auth
изначально только принятых ASCII букв и цифр в именах пользователей. Хотя это не был преднамеренный выбор, символы Unicode всегда принимались при использовании Python 3.
Валидатор имени пользователя теперь явно принимает символы Unicode по умолчанию только на Python 3.
Пользовательские модели могут использовать новый
ASCIIUsernameValidator
или
UnicodeUsernameValidator
.
Незначительные особенности ¶
django.contrib.admin
¶
- Для сайтов, работающих по подпутью, значение по умолчанию в верхней части каждой страницы администратора теперь будет указывать на, если установлено, вместо .
URL for the "View site" link
request.META['SCRIPT_NAME']
/
- Сообщение об успешном выполнении, которое появляется после добавления или редактирования объекта, теперь содержит ссылку на форму изменения объекта.
- Весь встроенный JavaScript удален, поэтому вы можете включить
Content-Security-Policy
HTTP-заголовок, если хотите. - Новый
InlineModelAdmin.classes
атрибут позволяет указывать классы во встроенных наборах полей. Строки сcollapse
классом будут изначально свернуты, а в их заголовке будет небольшая ссылка «показать». - Если у пользователя нет разрешения на добавление,
object-tools
теперь будет отображаться блок в списке изменений модели (без кнопки добавления). В этом случае это упрощает добавление пользовательских инструментов. - Теперь
LogEntry
модель хранит сообщения об изменениях в структуре JSON, чтобы сообщение можно было динамически переводить с использованием текущего активного языка.LogEntry.get_change_message()
Теперь предпочтительным способом получения сообщения об изменении является новый метод. - Выбранные объекты для полей
ModelAdmin.raw_id_fields
теперь имеют ссылку на форму изменения объекта. - Добавлены варианты «Без даты» и «Имеет дату»,
DateFieldListFilter
если поле допускает значение NULL. - Библиотека jQuery, встроенная в админку, обновлена с версии 2.1.4 до 2.2.3.
django.contrib.auth
¶
- Добавлена поддержка хэша пароля Argon2 . Рекомендуется использовать вместо PBKDF2, но не по умолчанию, так как для этого требуется сторонняя библиотека.
- Количество итераций по умолчанию для хешера паролей PBKDF2 увеличено на 25%. Это изменение с обратной совместимостью не повлияет на пользователей, которые создали подклассы,
django.contrib.auth.hashers.PBKDF2PasswordHasher
чтобы изменить значение по умолчанию. - Представление
django.contrib.auth.views.logout()
отправляет заголовки «без кеширования», чтобы предотвратить проблему, при которой Safari кэширует перенаправления и не позволяет пользователю выйти из системы. - Добавлен необязательный
backend
аргумент,django.contrib.auth.login()
позволяющий использовать его без учетных данных. - Новый
LOGOUT_REDIRECT_URL
параметр управляет перенаправлениемdjango.contrib.auth.views.logout()
представления, если представление не получаетnext_page
аргумент. - Новый
redirect_authenticated_user
параметр дляdjango.contrib.auth.views.login()
представления позволяет перенаправлять аутентифицированных пользователей, посещающих страницу входа. - Новые
AllowAllUsersModelBackend
иAllowAllUsersRemoteUserBackend
игнорируют значениеUser.is_active
,ModelBackend
аRemoteUserBackend
теперь отклоняют неактивных пользователей.
django.contrib.gis
¶
- Поисковые запросы расстояния теперь принимают выражения в качестве параметра значения расстояния.
- Новое
GEOSGeometry.unary_union
свойство вычисляет объединение всех элементов этой геометрии. - Добавлен
GEOSGeometry.covers()
бинарный предикат. - Добавлен
GDALBand.statistics()
методmean
иstd
атрибуты. - Добавлена поддержка
MakeLine
агрегатов иGeoHash
функций на SpatiaLite. - Добавлена поддержка
Difference
,Intersection
иSymDifference
функций на MySQL. - Добавлена поддержка создания экземпляров пустой геометрии GEOS.
- Новые свойства
trim
и позволяют управлять выводом дробной части координат в WKT.precision
WKTWriter
- Добавлен
LineString.closed
иMultiLineString.closed
свойства. - Сериализатору GeoJSON Теперь выводит первичный ключ объектов в
properties
словаре , если не указаны конкретные поля. - Добавлена возможность репликации входных данных по
GDALBand.data()
методу. Данные диапазона теперь можно эффективно обновлять повторяющимися значениями. - Добавлены функции базы данных
IsValid
иMakeValid
, а такжеisvalid
поиск, все для PostGIS. Это позволяет фильтровать и исправлять недопустимую геометрию на стороне базы данных. - Добавлена поддержка растров для всех пространственных поисков .
django.contrib.postgres
¶
- Для удобства
HStoreField
теперь преобразует свои ключи и значения в строки.
django.contrib.sessions
¶
- Команда
clearsessions
управления теперь удаляет сеансы на основе файлов.
django.contrib.sites
¶
Site
Модель поддерживает естественные ключи .
django.contrib.staticfiles
¶
static
Шаблонный тег теперь использует ,django.contrib.staticfiles
если он находится вINSTALLED_APPS
. Это особенно полезно для сторонних приложений, которые теперь всегда могут использовать (вместо или ) и не беспокоиться о том, установлено ли приложение.{% load static %}
{% load staticfiles %}
{% load static from staticfiles %}
staticfiles
- Вы можете легко настроить
на вариант с обычаем .
collectstatic --ignore
AppConfig
Кэш ¶
- Бэкэнд файлового кеша теперь использует самый высокий протокол травления.
CSRF ¶
- По умолчанию
CSRF_FAILURE_VIEW
,views.csrf.csrf_failure()
теперь принимает необязательныйtemplate_name
параметр, по умолчанию'403_csrf.html'
, для управления шаблоном , используемого для отображения страницы. - Для защиты от Breach атак, механизм защиты от CSRF Теперь изменяет значение маркеров формы на каждом запросе (сохраняя при этом инвариантном секрете , который может быть использован для проверки различных символов).
Бэкэнды базы данных ¶
- Вычитание временных данных унифицировано на всех бэкендах.
- Если база данных поддерживает это, серверные части могут устанавливать
DatabaseFeatures.can_return_ids_from_bulk_insert=True
и реализовыватьDatabaseOperations.fetch_returned_insert_ids()
первичные ключи для объектов, созданных с использованиемQuerySet.bulk_create()
. - Добавлены ключевые аргументы для
as_sql()
методов различных выражений (Func
,When
,Case
иOrderBy
) , чтобы движки базы данных , чтобы настроить их без мутируетself
, который не является безопасным при использовании различных движки баз данных. Смотритеarg_joiner
и**extra_context
параметрыFunc.as_sql()
для примера.
Файловое хранилище ¶
- Движки хранения в настоящее время представляют собой часовой пояс-Aware API с новыми методами
get_accessed_time()
,get_created_time()
иget_modified_time()
. Они возвращают часовой пояс,datetime
еслиUSE_TZ
есть,True
и наивныйdatetime
в местном часовом поясе в противном случае. - Новый
Storage.generate_filename()
метод упрощает реализацию пользовательских хранилищ, которые не используютos.path
вызовы, ранее использовавшиеся вFileField
.
Формы ¶
- Форма и виджет
Media
теперь обслуживаются с использованием,django.contrib.staticfiles
если они установлены. <input>
Тег , оказываемый вCharField
настоящее время включает в себяminlength
атрибут , если поле имеетmin_length
.- Обязательные поля формы теперь имеют
required
атрибут HTML. Установите для новогоForm.use_required_attribute
атрибута значение,False
чтобы отключить его.required
Атрибут не включен форм FormSets , поскольку проверка браузер не может быть правильным при добавлении и удалении FormSets.
Интернационализация ¶
i18n_patterns()
Вспомогательная функция теперь может быть использована в корне URLconf указанного с помощьюrequest.urlconf
.- Установив новый
prefix_default_language
параметр дляi18n_patterns()
toFalse
, вы можете разрешить доступ к языку по умолчанию без префикса URL. set_language()
теперь возвращает код состояния 204 (без содержимого) для запросов AJAX, еслиnext
вPOST
или нет параметраGET
.- Представления на основе классов
JavaScriptCatalog
иJSONCatalog
заменяют устаревшие представленияjavascript_catalog()
и представления на основеjson_catalog()
функций. Новые представления почти эквивалентны старым, за исключением того, что по умолчанию новые представления собирают все строки JavaScript вdjangojs
домене перевода из всех установленных приложений, а не только строки JavaScript изLOCALE_PATHS
.
Команды управления ¶
call_command()
теперь возвращает значение, возвращаемоеcommand.handle()
методом.- Новая опция позволяет указать уровень сообщения, при котором команда завершится с ненулевым статусом.
check --fail-level
- Новая опция заставляет команду завершать работу с ненулевым статусом, когда обнаруживаются изменения модели без миграций.
makemigrations --check
makemigrations
теперь отображает путь к файлам миграции, которые он генерирует.- Теперь опция позволяет принудительно использовать «простой» интерпретатор Python.
shell --interface
python
- Новая опция позволяет вам запустить команду от имени Django и выйти, вместо того, чтобы открывать интерактивную оболочку.
shell --command
- Добавлено предупреждение о
dumpdata
том, что прокси-модель указана (что не приводит к выходным данным ) без ее конкретного родителя. - Для нового
BaseCommand.requires_migrations_checks
атрибута может быть установлено значение,True
если вы хотите, чтобы ваша команда выводила предупреждение, как этоrunserver
делает, если набор миграций на диске не совпадает с миграциями в базе данных. - Чтобы помочь с тестированием,
call_command()
теперь принимает объект команды в качестве первого аргумента. - Команда
shell
поддерживает завершение табуляции в системах, использующихlibedit
, например, macOS. - Команда
inspectdb
позволяет вам выбрать, какие таблицы следует проверить, указав их имена в качестве аргументов.
Миграции ¶
- Добавлена поддержка сериализации
enum.Enum
объектов. - Добавлен
elidable
аргумент дляRunSQL
иRunPython
операций , чтобы позволить им быть удалены , когда давя миграции. - Добавлена поддержка неатомарных миграций путем установки
atomic
атрибута вMigration
. - В
migrate
иmakemigrations
команды в настоящее время проверить наличие последовательной истории миграции . Если они обнаруживают неприменимые зависимости применяемой миграции, появляетсяInconsistentMigrationHistory
. pre_migrate()
Иpost_migrate()
сигналы в настоящее время отправки их миграцииplan
иapps
.
Модели ¶
- Обратные внешние ключи из прокси-моделей теперь распространяются на их конкретный класс. Обратное отношение, связанное с
ForeignKey
указанием на прокси-модель, теперь доступно в качестве дескриптора в классе прокси-модели и может использоваться при фильтрации набора запросов. - Новый
Field.rel_db_type()
метод возвращает тип данных столбца базы данных для таких полей, какForeignKey
и,OneToOneField
которые указывают на другое поле. arity
Атрибут класса добавляетсяFunc
. Этот атрибут можно использовать для установки количества аргументов, которые принимает функция.- Добавлено
BigAutoField
который действует во многом какAutoField
кроме того, что он гарантированно соответствовать номера от1
к9223372036854775807
. QuerySet.in_bulk()
может быть вызван без каких-либо аргументов для возврата всех объектов в наборе запросов.related_query_name
теперь поддерживает приложения метки и класса интерполяции с использованием'%(app_label)s'
и'%(class)s'
строк.- Допускается переопределение полей модели, унаследованных от абстрактных базовых классов.
prefetch_related_objects()
Функция теперь публичный API.QuerySet.bulk_create()
устанавливает первичный ключ для объектов при использовании PostgreSQL.- Добавлена
Cast
функция базы данных. - Прокси-модель теперь может наследовать несколько прокси-моделей, которые имеют общий неабстрактный родительский класс.
- Добавлены
Extract
функции для извлечения компонентов даты и времени в виде целых чисел, таких как год и час. - Добавлены
Trunc
функции для усечения даты или даты и времени до значимого компонента. Они позволяют выполнять такие запросы, как продажи в день или продажи в час. Model.__init__()
теперь устанавливает значения виртуальных полей из своих аргументов ключевого слова.- Новые
Meta.base_manager_name
иMeta.default_manager_name
опции позволяют контролировать_base_manager
и_default_manager
, соответственно.
Запросы и ответы ¶
- Добавлено
request.user
в представление отладки. - Добавлены
HttpResponse
методыreadable()
и,seekable()
чтобы сделать экземпляр потокоподобным объектом и разрешить его обертыватьio.TextIOWrapper
. - Добавлено
HttpRequest.content_type
иcontent_params
атрибуты , которые разобраны изCONTENT_TYPE
заголовка. - Синтаксический анализатор для
request.COOKIES
упрощен, чтобы лучше соответствовать поведению браузеров.request.COOKIES
теперь могут содержать файлы cookie, которые недействительны в соответствии сRFC 6265, но их можно установить черезdocument.cookie
.
Сериализация ¶
django.core.serializers.json.DjangoJSONEncoder
Теперь знает , как сериализовать ленивые строки, как правило , используются для переводимого контента.
Шаблоны ¶
- Добавлена
autoescape
опция вDjangoTemplates
бэкэнд иEngine
класс. - Добавлены
is
и сравнения операторов в теге.is not
if
- Разрешено
dictsort
упорядочить список списков по элементу по указанному индексу. debug()
Контекст процессор содержит запросы для всех псевдонимов баз данных вместо только псевдоним по умолчанию.- Добавлена поддержка относительного пути для строковых аргументов тегов
extends
иinclude
шаблонов.
Тесты ¶
- Чтобы лучше
TestCase
выявлять ошибки, теперь проверяет отложенные ограничения базы данных в конце каждого теста. - Тесты и тестовые случаи могут быть помечены бирками
и работать избирательно с новым и опциями.
test --tag
test --exclude-tag
- Теперь вы можете войти в систему и использовать сеансы с тестовым клиентом, даже если
django.contrib.sessions
он не находится вINSTALLED_APPS
.
URL-адреса ¶
- Добавление
django.setup()
позволяетFORCE_SCRIPT_NAME
учитывать URL-адреса, происходящие вне цикла запроса / ответа (например, в командах управления и автономных скриптах), при его установке.
Валидаторы ¶
URLValidator
теперь ограничивает длину меток доменных имен до 63 символов, а общую длину доменных имен до 253 символов на RFC 1034 .int_list_validator()
теперь принимает необязательныйallow_negative
логический параметр, по умолчаниюFalse
, чтобы разрешить отрицательные целые числа.
Обратно несовместимые изменения в 1.10 ¶
Предупреждение
В дополнение к изменениям, описанным в этом разделе, обязательно ознакомьтесь с функциями, удаленными в 1.10, для тех функций, которые достигли конца цикла устаревания и, следовательно, были удалены. Если вы не обновили свой код в течение срока прекращения поддержки для данной функции, ее удаление может показаться обратным несовместимым изменением.
API серверной части базы данных ¶
- ГИС
AreaField
использует неопределенный базовый числовой тип, который на практике может быть любым числовым типом Python.decimal.Decimal
значения, полученные из базы данных, теперь конвертируются в,float
чтобы упростить их объединение со значениями, используемыми библиотеками ГИС. - Чтобы включить временное вычитание, вы должны установить
supports_temporal_subtraction
флаг функции базы данныхTrue
и реализоватьDatabaseOperations.subtract_temporals()
метод. Этот метод должен возвращать SQL и параметры , необходимый для вычисления разницы в микросекундах междуlhs
иrhs
аргументами в типе данных , используемых для храненияDurationField
.
_meta.get_fields()
возвращает согласованные обратные поля для прокси-моделей ¶
До Django 1.10 get_fields()
метод возвращал разные обратные поля при вызове в модели прокси по сравнению с его конкретным прокси-классом. Это несоответствие было исправлено путем возврата полного набора полей, указывающих на конкретный класс или один из его прокси в обоих случаях.
AbstractUser.username
max_length
увеличена до 150 ¶
Перенос для django.contrib.auth.models.User.username
включен. Если у вас есть настраиваемая пользовательская модель, наследующая от AbstractUser
, вам необходимо создать и применить миграцию базы данных для вашей пользовательской модели.
Мы рассмотрели увеличение до 254 символов, чтобы упростить использование адресов электронной почты (которые ограничены 254 символами) в качестве имен пользователей, но отклонили это из-за ограничений MySQL. При использовании utf8mb4
кодировки (рекомендуется для правильной поддержки Unicode) MySQL по умолчанию может создавать уникальные индексы только с 191 символом. Поэтому, если вам нужна большая длина, используйте индивидуальную пользовательскую модель.
Если вы хотите сохранить ограничение в 30 символов для имен пользователей, используйте настраиваемую форму при создании пользователя или изменении имени пользователя:
from django.contrib.auth.forms import UserCreationForm
class MyUserCreationForm(UserCreationForm):
username = forms.CharField(
max_length=30,
help_text='Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only.',
)
Если вы хотите сохранить это ограничение в админке, установите UserAdmin.add_form
для использования эту форму:
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.models import User
class UserAdmin(BaseUserAdmin):
add_form = MyUserCreationForm
admin.site.unregister(User)
admin.site.register(User, UserAdmin)
Прекращена поддержка PostgreSQL 9.1 ¶
Поддержка PostgreSQL 9.1 в апстриме заканчивается в сентябре 2016 года. Как следствие, Django 1.10 устанавливает PostgreSQL 9.2 как минимальную официально поддерживаемую версию.
runserver
вывод проходит через лог ¶
Обработка запросов и ответов на runserver
команду отправляется в
регистратор django.server, а не в sys.stderr
. Если вы отключите конфигурацию ведения журнала Django или замените ее своей собственной, вам нужно будет добавить соответствующую конфигурацию ведения журнала, если вы хотите увидеть этот вывод:
'formatters': {
'django.server': {
'()': 'django.utils.log.ServerFormatter',
'format': '[%(server_time)s] %(message)s',
}
},
'handlers': {
'django.server': {
'level': 'INFO',
'class': 'logging.StreamHandler',
'formatter': 'django.server',
},
},
'loggers': {
'django.server': {
'handlers': ['django.server'],
'level': 'INFO',
'propagate': False,
}
}
auth.CustomUser
и auth.ExtensionUser
тестовые модели были удалены ¶
С момента появления миграции для приложений contrib в Django 1.8 таблицы этих пользовательских тестовых моделей больше не создавались, что делало их непригодными для использования в контексте тестирования.
Реестр приложений больше не заполняется автоматически при извлечении моделей вне Django ¶
Реестр приложений больше не заполняется автоматически при отборе моделей. Это было добавлено в Django 1.7.2 как попытка разрешить распаковку моделей вне Django, например, в RQ worker, без вызова django.setup()
, но это создает возможность тупиковой ситуации. Чтобы адаптировать свой код в случае RQ, вы можете предоставить свой собственный рабочий скрипт,
который вызывает django.setup()
.
Удалена проверка нулевого назначения для ненулевых полей внешнего ключа ¶
В более старых версиях присвоение None
не обнуляемому ForeignKey
или
OneToOneField
поднятому . Для согласованности с другими полями модели, которые не имеют подобной проверки, эта проверка удалена.ValueError('Cannot assign None: "model.field" does
not allow null values.')
Удалены хешеры слабых паролей из PASSWORD_HASHERS
настройки по умолчанию ¶
Django 0.90 хранит пароли как несоленые MD5. В Django 0.91 добавлена поддержка соленого SHA1 с автоматическим обновлением паролей при входе пользователя в систему. Django 1.4 добавил PBKDF2 в качестве хэшера паролей по умолчанию.
Если у вас есть старый проект Django с закодированными паролями MD5 или SHA1 (даже солеными), имейте в виду, что их можно довольно легко взломать с помощью современного оборудования. Чтобы пользователи Django признали продолжение использования слабых хешеров, следующие хешеры удалены из PASSWORD_HASHERS
настройки по умолчанию :
'django.contrib.auth.hashers.SHA1PasswordHasher'
'django.contrib.auth.hashers.MD5PasswordHasher'
'django.contrib.auth.hashers.UnsaltedSHA1PasswordHasher'
'django.contrib.auth.hashers.UnsaltedMD5PasswordHasher'
'django.contrib.auth.hashers.CryptPasswordHasher'
Рассмотрите возможность использования обернутого хешера паролей для усиления хэшей в вашей базе данных. Если это невозможно, добавьте
PASSWORD_HASHERS
настройку в свой проект и добавьте обратно все нужные хешеры.
Вы можете проверить, есть ли в вашей базе данных какие-либо удаленные хешеры, например:
from django.contrib.auth import get_user_model
User = get_user_model()
# Unsalted MD5/SHA1:
User.objects.filter(password__startswith='md5$$')
User.objects.filter(password__startswith='sha1$$')
# Salted MD5/SHA1:
User.objects.filter(password__startswith='md5$').exclude(password__startswith='md5$$')
User.objects.filter(password__startswith='sha1$').exclude(password__startswith='sha1$$')
# Crypt hasher:
User.objects.filter(password__startswith='crypt$$')
from django.db.models import CharField
from django.db.models.functions import Length
CharField.register_lookup(Length)
# Unsalted MD5 passwords might not have an 'md5$$' prefix:
User.objects.filter(password__length=32)
Field.get_prep_lookup()
и Field.get_db_prep_lookup()
методы удалены ¶
Если у вас есть настраиваемое поле, реализующее любой из этих методов, зарегистрируйте для него настраиваемый поиск. Например:
from django.db.models import Field
from django.db.models.lookups import Exact
class MyField(Field):
...
class MyFieldExact(Exact):
def get_prep_lookup(self):
# do_custom_stuff_for_myfield
....
MyField.register_lookup(MyFieldExact)
django.contrib.gis
¶
- Поддержка SpatiaLite <3.0 и GEOS <3.3 прекращена.
- В
add_postgis_srs()
псевдониме обратной совместимости дляdjango.contrib.gis.utils.add_srs_entry()
удаляется. - В Oracle / GIS
Area
агрегатная функция теперь возвращаетfloat
вместоdecimal.Decimal
. (Он все еще упакован в квадратные метры.) - Представление по умолчанию
GEOSGeometry
(вывод WKT) по умолчанию обрезано. То есть вместо того , чтобы получить .POINT (23.0000000000000000 5.5000000000000000)
POINT (23 5.5)
Максимальный размер тела запроса и количество параметров GET / POST ограничены ¶
Два новых параметра помогают снизить уровень атак типа «отказ в обслуживании» с помощью больших запросов:
DATA_UPLOAD_MAX_MEMORY_SIZE
ограничивает размер тела запроса. Загрузки файлов не учитываются в этом лимите.DATA_UPLOAD_MAX_NUMBER_FIELDS
ограничивает количество анализируемых параметров GET / POST.
Приложениям, которые получают сообщения необычно большой формы, возможно, потребуется настроить эти параметры.
Разное ¶
- Объект
repr()
aQuerySet
завернут, чтобы исключить его из простого списка при отладке.<QuerySet >
utils.version.get_version()
возвращается Версии-кандидаты, совместимые с PEP 440 (например, «1.10rc1» вместо «1.10c1»).- Значения токенов CSRF теперь должны быть строками из 64 букв и цифр; значения из 32 буквенно-цифровых символов, установленные по умолчанию в старых версиях Django, автоматически заменяются строками из 64 символов. Остальные значения считаются недопустимыми. Это должно коснуться только разработчиков или пользователей, которые заменяют эти токены.
- Этот
LOGOUT_URL
параметр удален, поскольку Django не использовал его с версии до 1.0. Если вы используете его в своем проекте, вы можете добавить его в настройки своего проекта. Значение по умолчанию было'/accounts/logout/'
. - Объекты, которым
close()
переданы такие методы, как файлы и генераторыHttpResponse
, теперь закрываются немедленно, а не тогда, когда сервер WSGI вызываетclose()
ответ. - Избыточный
transaction.atomic()
вызовQuerySet.update_or_create()
удален. Это может повлиять на количество запросов, проверенныхTransactionTestCase.assertNumQueries()
. - Поддержка
skip_validation
inBaseCommand.execute(**options)
удалена.skip_checks
Вместо этого используйте (добавлено в Django 1.7). loaddata
теперь вызываетCommandError
вместо предупреждения, когда указанный файл фикстуры не найден.- Вместо прямого доступа к
LogEntry.change_message
атрибуту теперь лучше вызватьLogEntry.get_change_message()
метод, который предоставит сообщение на текущем языке. - Отображение ошибок по умолчанию теперь увеличивается,
TemplateDoesNotExist
еслиtemplate_name
указано несуществующее . - Неиспользованный
choices
ключевое слово аргументSelect
иSelectMultiple
виджетыrender()
метода удаляется.choices
Аргументrender_options()
метода также удаляется, что делаетselected_choices
первый аргумент. - Тесты, которые нарушают отложенные ограничения базы данных, теперь будут вызывать ошибку при запуске в базе данных, которая поддерживает отложенные ограничения.
- Встроенные команды управления теперь используют индексацию ключей
options
, напримерoptions['verbosity']
, вместо приведенияoptions.get()
какого-либо типа и больше не выполняют его. Это может быть проблемой, если вы вызываете команды, используяCommand.execute()
(в обход парсера аргументов, который устанавливает значение по умолчанию) вместоcall_command()
. Вместо вызоваCommand.execute()
передайте объект команды в качестве первого аргумента функцииcall_command()
. ModelBackend
иRemoteUserBackend
теперь отклоняйте неактивных пользователей. Это означает, что неактивные пользователи не могут войти в систему и выйдут из системы при переключении сis_active=True
наFalse
. Если вам нужно предыдущее поведение, используйте вместо него новыйAllowAllUsersModelBackend
илиAllowAllUsersRemoteUserBackend
inAUTHENTICATION_BACKENDS
.- В свете предыдущего изменения метод тестового клиента
login()
больше не всегда отклоняет неактивных пользователей, а вместо этого делегирует это решение бэкэнду аутентификации.force_login()
также делегирует решение бэкэнду аутентификации, поэтому, если вы используете бэкэнд по умолчанию, вам нужно использовать активного пользователя. django.views.i18n.set_language()
теперь может возвращать код состояния 204 для запросов AJAX.base_field
АтрибутRangeField
теперь тип поля, не является экземпляром поля. Если вы создали собственный подклассRangeField
, вам следует изменитьbase_field
атрибут.- Классы промежуточного программного обеспечения теперь инициализируются при запуске сервера, а не во время первого запроса.
- Если вы переопределяете
is_authenticated()
илиis_anonymous()
в пользовательской модели пользователя, вы должны преобразовать их в атрибуты или свойства, как описано в примечании об устаревании . - При использовании
ModelAdmin.save_as=True
кнопка «Сохранить как новый» теперь перенаправляет на вид изменений для нового объекта, а не на список изменений модели. Если вам нужно предыдущее поведение, установите для новогоModelAdmin.save_as_continue
атрибута значениеFalse
. - Обязательные поля формы теперь имеют
required
атрибут HTML. Установите дляForm.use_required_attribute
атрибута значение,False
чтобы отключить его. Вы также можете добавитьnovalidate
атрибут,<form>
если не хотите проверки браузера. Чтобы отключитьrequired
атрибут в пользовательских виджетах, переопределитеWidget.use_required_attribute()
метод. - Обработчик WSGI больше не удаляет содержимое ответов из
HEAD
запросов или ответов соstatus_code
значениями 100–199, 204 или 304. Большинство веб-серверов уже реализуют это поведение. К ответам, полученным с помощью тестового клиента Django, по-прежнему применяются эти «исправления ответов». Model.__init__()
теперь получаетdjango.db.models.DEFERRED
как значение отложенных полей.Model._deferred
Атрибут удаляется как динамические модели классов при использованииQuerySet.defer()
иonly()
удаляется.Storage.save()
больше не заменяется'\'
на'/'
. Это поведение перемещено,FileSystemStorage
поскольку это конкретная деталь реализации хранилища. Любой пользователь Windows с реализацией настраиваемого хранилища, который полагается на это поведение, должен будет реализовать его вsave()
методе настраиваемого хранилища .- Частные
FileField
методыget_directory_name()
иget_filename()
не больше не вызывается (и теперь устаревшее) , который является назад несовместимое изменение для пользователей этих методов временной отмены пользовательских полей. Чтобы адаптировать такой код, переопределитеFileField.generate_filename()
илиStorage.generate_filename()
вместо него. Возможноupload_to
также использовать . - Тема письма, отправляемого пользователем
AdminEmailHandler
, больше не обрезается до 989 символов. Если вы рассчитывали на ограниченную длину, обрежьте тему самостоятельно. - Частные выражения
django.db.models.expressions.Date
иDateTime
удаляются. НовыеTrunc
выражения обеспечивают ту же функциональность. _base_manager
И_default_manager
атрибуты удаляются из экземпляров модели. Они остаются доступными в классе модели.- Доступ к удаленному полю в экземпляре модели, например, после , перезагружает значение поля вместо увеличения .
del obj.field
AttributeError
- Если вы создаете подкласс
AbstractBaseUser
и переопределяетеclean()
, убедитесь, что он вызываетsuper()
.AbstractBaseUser.normalize_username()
вызывается в новомAbstractBaseUser.clean()
методе. - Частный API
django.forms.models.model_to_dict()
возвращает набор запросов, а не список первичных ключей дляManyToManyField
s. - Если
django.contrib.staticfiles
установлен,static
тег шаблона используетstaticfiles
хранилище для создания URL-адреса, а не просто объединяет значение сSTATIC_ROOT
. Новый подход кодирует URL-адрес, который может быть обратно несовместимым в таких случаях, как включение фрагмента в путь, например , поскольку кодируется как . Для того, чтобы адаптировать, переместить фрагмент вне тег шаблона: .{% static 'img.svg#fragment' %}
#
%23
{% static 'img.svg' %}#fragment
- Когда
USE_L10N
этоTrue
, локализация в настоящее время применяется дляdate
иtime
фильтров , когда не указана строка формата. СпецификаторыDATE_FORMAT
иTIME_FORMAT
из активного языкового стандарта используются вместо одноименных настроек.
Функции, устаревшие в версии 1.10 ¶
Прямое присвоение обратному внешнему ключу или отношению «многие ко многим» ¶
Вместо присвоения связанных объектов с использованием прямого присвоения:
>>> new_list = [obj1, obj2, obj3]
>>> e.related_set = new_list
Используйте set()
метод, добавленный в Django 1.9:
>>> e.related_set.set([obj1, obj2, obj3])
Это предотвращает путаницу в отношении присвоения, приводящую к неявному сохранению.
Storage
API без учета часовых поясов ¶
Старые методы accessed_time()
, не учитывающие часовые пояса created_time()
, и modified_time()
устарели в пользу новых get_*_time()
методов.
Сторонние серверные части хранилища должны реализовать новые методы и пометить старые как устаревшие. А пока новые get_*_time()
методы базового
Storage
класса преобразуют datetime
старые методы по мере необходимости и при этом выдают предупреждение об устаревании.
Сторонние серверные части хранилища могут сохранять старые методы до тех пор, пока они хотят поддерживать более ранние версии Django.
django.contrib.gis
¶
get_srid()
Иset_srid()
методыGEOSGeometry
являются устаревшими в пользуsrid
собственности.get_x()
,set_x()
,get_y()
,set_y()
,get_z()
, Иset_z()
методыPoint
являются устаревшими в пользуx
,y
иz
свойств.get_coords()
Иset_coords()
методыPoint
являются устаревшими в пользуtuple
собственности.cascaded_union
СвойствоMultiPolygon
является устаревшим в пользуunary_union
собственности.django.contrib.gis.utils.precision_wkt()
Функция устарела в пользуWKTWriter
.
CommaSeparatedIntegerField
поле модели ¶
CommaSeparatedIntegerField
осуждается в пользу
CharField
с
validate_comma_separated_integer_list()
валидатора:
from django.core.validators import validate_comma_separated_integer_list
from django.db import models
class MyModel(models.Model):
numbers = models.CharField(..., validators=[validate_comma_separated_integer_list])
Если вы используете Oracle, CharField
используется другой тип поля базы данных ( NVARCHAR2
), чем CommaSeparatedIntegerField
( VARCHAR2
). В зависимости от настроек вашей базы данных это может означать другую кодировку и, следовательно, другую длину (в байтах) для одного и того же содержимого. Если ваши сохраненные значения длиннее предела в 4000 байт NVARCHAR2
, вы должны использовать вместо этого TextField
( NCLOB
). В этом случае, если у вас есть какие-либо запросы, группирующиеся по полю (например, аннотирование модели с помощью агрегирования или использования distinct()
), вам необходимо изменить их (чтобы отложить поле).
__search
поиск по запросу ¶
search
Поиск, который поддерживает MySQL только и крайне ограничен в особенности, является устаревшим. Замените его настраиваемым поиском:
from django.db import models
class Search(models.Lookup):
lookup_name = 'search'
def as_mysql(self, compiler, connection):
lhs, lhs_params = self.process_lhs(compiler, connection)
rhs, rhs_params = self.process_rhs(compiler, connection)
params = lhs_params + rhs_params
return 'MATCH (%s) AGAINST (%s IN BOOLEAN MODE)' % (lhs, rhs), params
models.CharField.register_lookup(Search)
models.TextField.register_lookup(Search)
Использование методов User.is_authenticated()
и User.is_anonymous()
как ¶
В is_authenticated()
и is_anonymous()
методы
AbstractBaseUser
и
AnonymousUser
классы теперь свойства. Они по-прежнему будут работать как методы до Django 2.0, но все их использование в Django теперь использует доступ по атрибутам.
Например, если вы используете
AuthenticationMiddleware
и хотите узнать, вошел ли пользователь в систему в настоящее время, вы должны использовать:
if request.user.is_authenticated:
... # Do something for logged-in users.
else:
... # Do something for anonymous users.
вместо request.user.is_authenticated()
.
Это изменение позволяет избежать случайной утечки информации, если вы забудете вызвать метод, например:
if request.user.is_authenticated:
return sensitive_information
Если вы переопределяете эти методы в пользовательской модели пользователя, вы должны изменить их на свойства или атрибуты.
Django использует CallableBool
объект, чтобы эти атрибуты работали как свойство, так и как метод. Таким образом, пока не закончится период устаревания, вы не сможете сравнивать эти свойства с помощью is
оператора. То есть не сработает следующее:
if request.user.is_authenticated is True:
...
«Побег» половина django.utils.safestring
¶
mark_for_escaping()
Функции и классы , которые он использует: EscapeData
,
EscapeBytes
, EscapeText
, EscapeString
и EscapeUnicode
являются устаревшими.
В результате «ленивое» поведение escape
фильтра (когда он всегда будет применяться в качестве последнего фильтра, независимо от того, где в цепочке фильтров он появился) не рекомендуется. Фильтр изменится на немедленное применение
conditional_escape()
в Django 2.0.
Разное ¶
- Устарели в пользу
варианты.
makemigrations --exit
makemigrations --check
django.utils.functional.allow_lazy()
устарел в пользу новойkeep_lazy()
функции, которую можно использовать с более естественным синтаксисом декоратора.- Этот параметр устарел в пользу или
.
shell --plain
-i python
--interface python
- Импорт из
django.core.urlresolvers
модуля является устаревшим в пользу нового места,django.urls
. - Метод шаблона
Context.has_key()
устарел в пользуin
. - Частный атрибут
virtual_fields
изModel._meta
осуждается в пользуprivate_fields
. - Аргументы частного ключевого слова
virtual_only
inField.contribute_to_class()
иvirtual
inModel._meta.add_field()
устарели в пользуprivate_only
иprivate
, соответственно. - Представления
javascript_catalog()
иjson_catalog()
устарели в пользу представлений на основе классовJavaScriptCatalog
иJSONCatalog
. - При многотабличном наследовании неявное преобразование a
OneToOneField
в aparent_link
не рекомендуется. Добавьтеparent_link=True
в такие поля. - Частный API
Widget._format_value()
становится общедоступным и переименовывается вformat_value()
. Старое имя будет работать в течение периода устаревания. - Частные
FileField
методыget_directory_name()
иget_filename()
не рекомендуются в пользу выполнения этой работы вStorage.generate_filename()
). - Используемое промежуточное ПО в старом стиле
settings.MIDDLEWARE_CLASSES
устарело. Адаптируйте старое настраиваемое промежуточное ПО и используйте новуюMIDDLEWARE
настройку.
Функции, удаленные в 1.10 ¶
Эти функции достигли конца цикла устаревания и удалены в Django 1.10. Подробные сведения см. В разделе « Функции, не рекомендуемые в версии 1.8» , в том числе о том, как отказаться от использования этих функций.
- Поддержка
SQLCompiler
прямого вызова a как псевдонима для вызова егоquote_name_unless_alias
метода удалена. cycle
Иfirstof
теги шаблонов удаляются изfuture
библиотеки шаблонов тегов.django.conf.urls.patterns()
устранен.- Поддержка
prefix
аргумента дляdjango.conf.urls.i18n.i18n_patterns()
удалена. SimpleTestCase.urls
устранен.- Использование неправильного подсчета распакованных значений в
for
теге шаблона вызывает исключение, а не приводит к ошибке. - Возможность
reverse()
URL-адресов с использованием пути Python, разделенного точками, удалена. - Возможность использовать точечный путь Python для
LOGIN_URL
иLOGIN_REDIRECT_URL
настроек удаляются. - Поддержка
optparse
пользовательских команд управления прекращена. - Класс
django.core.management.NoArgsCommand
удален. django.core.context_processors
модуль удален.django.db.models.sql.aggregates
модуль удален.django.contrib.gis.db.models.sql.aggregates
модуль удален.- Удаляются следующие методы и свойства
django.db.sql.query.Query
:- Свойства:
aggregates
иaggregate_select
- Методы
add_aggregate
,set_aggregate_mask
иappend_aggregate_mask
.
- Свойства:
django.template.resolve_variable
устранен.- Следующие частные API удалены из
django.db.models.options.Options
(Model._meta
):get_field_by_name()
get_all_field_names()
get_fields_with_model()
get_concrete_fields_with_model()
get_m2m_with_model()
get_all_related_objects()
get_all_related_objects_with_model()
get_all_related_many_to_many_objects()
get_all_related_m2m_objects_with_model()
error_message
Аргументdjango.forms.RegexField
удаляется.- Не
unordered_list
фильтр больше не поддерживает старые списки стилей. - Поддержка строковых
view
аргументов дляurl()
удалена. - Обратная совместимость прокладка переименовать
django.forms.Form._has_changed()
вhas_changed()
удаляется. removetags
Шаблон фильтр удаляется.- Функции
remove_tags()
иstrip_entities()
вdjango.utils.html
удалены. is_admin_site
Аргументdjango.contrib.auth.views.password_reset()
удаляется.django.db.models.field.subclassing.SubfieldBase
устранен.django.utils.checksums
устранен.original_content_type_id
Атрибутdjango.contrib.admin.helpers.InlineAdminForm
удаляется.- Прокладка обратной совместимости, позволяющая
FormMixin.get_form()
определять без значения по умолчанию для ееform_class
аргумента, удаляется. - Следующие настройки будут удалены, и вы должны обновить их до
TEMPLATES
настройки:ALLOWED_INCLUDE_ROOTS
TEMPLATE_CONTEXT_PROCESSORS
TEMPLATE_DEBUG
TEMPLATE_DIRS
TEMPLATE_LOADERS
TEMPLATE_STRING_IF_INVALID
- Псевдоним обратной совместимости
django.template.loader.BaseLoader
удален. - Объекты шаблонов Django, возвращаемые
get_template()
иselect_template()
больше не принимающиеContext
в своемrender()
методе. - API-интерфейсы шаблонов ответов предписывают использование
dict
объектов шаблона и, зависящихот серверной части, вместоContext
и,Template
соответственно. current_app
Параметр для следующей функции и классы удаляют:django.shortcuts.render()
django.template.Context()
django.template.RequestContext()
django.template.response.TemplateResponse()
- Эти
dictionary
иcontext_instance
параметры для следующих функций удаляются:django.shortcuts.render()
django.shortcuts.render_to_response()
django.template.loader.render_to_string()
- Удален
dirs
параметр для следующих функций:django.template.loader.get_template()
django.template.loader.select_template()
django.shortcuts.render()
django.shortcuts.render_to_response()
- Проверка сеанса включена независимо от того , или нет
,
'django.contrib.auth.middleware.SessionAuthenticationMiddleware'
вMIDDLEWARE_CLASSES
.SessionAuthenticationMiddleware
больше не имеет цели и может быть удален изMIDDLEWARE_CLASSES
. Он хранится в виде заглушки до Django 2.0 в качестве любезности для пользователей, которые не читают эту заметку. - Приватный атрибут
django.db.models.Field.related
удален. --list
Вариант изmigrate
команды управления удаляется.ssi
Шаблонный тег удаляется.- Поддержка
=
оператора сравнения вif
теге шаблона удалена. - Прокладки обратной совместимости, разрешающие
Storage.get_available_name()
иStorage.save()
определяемые безmax_length
аргументов, удаляются. - Поддержка устаревшего
%(<foo>)s
синтаксиса вModelFormMixin.success_url
. GeoQuerySet
агрегатные методыcollect()
,extent()
,extent3d()
,make_line()
, иunionagg()
удаляются.- Возможность указывать
ContentType.name
при создании экземпляра типа контента удалена. - Поддержка старой подписи
allow_migrate
удалена. - Поддержка синтаксиса, в котором используются аргументы, разделенные запятыми, удалена.
{% cycle %}
- Предупреждение, которое
Signer
выдается при указании недопустимого разделителя, теперь имеет видValueError
.