Примечания к выпуску 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
¶
- Для сайтов, работающих по подпутью, в верхней части каждой страницы администрирования теперь учитывается, установлен ли он вместо .
l'URL par défaut du lien « Voir sur le site »
request.META['SCRIPT_NAME']
/
- Сообщение об успешном выполнении, которое появляется после добавления или редактирования объекта, теперь содержит ссылку на форму редактирования соответствующего объекта.
- Весь встроенный код JavaScript был удален, поэтому при желании можно включить HTTP-заголовок
Content-Security-Policy
. - Новый атрибут
InlineModelAdmin.classes
позволяет вам указывать классы для встроенных подчиненных форм. Они, если у них есть классcollapse
, изначально свернуты, а их заголовок содержит небольшую ссылку «Показать». - Если у пользователя нет разрешения на добавление,
object-tools
теперь будет отображаться блок в списке изменений модели (без кнопки добавления). В этом случае это упрощает добавление пользовательских инструментов. - Теперь модель
LogEntry
хранит свои сообщения об изменении в структуре JSON, чтобы сообщения можно было динамически переводить на активный язык.LogEntry.get_change_message()
Теперь предпочтительным способом получения сообщений об изменениях является новый метод . - У объектов, выбранных для полей в,
ModelAdmin.raw_id_fields
теперь есть ссылка на форму редактирования объектов. - Варианты «Без даты» и «Имеет дату» были добавлены для фильтра
DateFieldListFilter
в случае, когда поле может содержать нулевое значение. - Библиотека 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
и ,precision
чтобыWKTWriter
позволить вам контролировать точность дробной части координат , полученных WKT. 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
если это приложение установлено. Это особенно полезно для сторонних приложений, которые теперь всегда могут использовать (вместо или ) и больше не заботятся о том, установлено приложение или нет.{% 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()
для примера.
Файловое хранилище ¶
- Двигатели хранения в настоящее время имеют часовой пояс осведомленный API с новыми методами
get_accessed_time()
,get_created_time()
иget_modified_time()
. Они возвращают объект,datetime
осведомленный о часовом поясе, если онUSE_TZ
равен,True
иdatetime
«наивный» объект в местном часовом поясе в противном случае. - Новый метод
Storage.generate_filename()
упрощает реализацию пользовательских хранилищ, которые не используют вызовыos.path
, которые ранее были вFileField
.
Формы ¶
- Содержимое класса
Media
Forms and Components теперь обслуживаетсяdjango.contrib.staticfiles
при установке этого приложения. - Тег,
<input>
отображаемый кCharField
настоящему моменту, включает атрибут,minlength
если у поля есть атрибутmin_length
. - Обязательные поля формы теперь имеют атрибут HTML
required
. Это можно отключить, установив для атрибутаForm.use_required_attribute
значениеFalse
. Атрибутrequired
не добавляется в сгруппированные формы, потому что проверка браузера не всегда корректна при добавлении или удалении таких форм.
Интернационализация ¶
- Теперь служебную функцию
i18n_patterns()
можно использовать в конфигурации корневого URL-адреса, обозначеннойrequest.urlconf
. - Установив новый параметр
prefix_default_language
отi18n_patterns()
доFalse
, вы можете разрешить доступ к языку по умолчанию без префикса URL. set_language()
теперь возвращает код состояния 204 (Нет содержимого) для запросов AJAX, когдаPOST
илиGET
не содержит параметрnext
.- Представления на основе классов
JavaScriptCatalog
иJSONCatalog
заменяют представления на основе функцийjavascript_catalog()
иjson_catalog()
. Новые представления почти эквивалентны старым, за исключением того, что по умолчанию новые представления собирают все строки JavaScript из всех приложений, установленных в домене перевода,djangojs
а не просто собирают строки JavaScript из путейLOCALE_PATHS
.
Команды администрирования ¶
call_command()
теперь возвращает значение, полученное от методаcommand.handle()
.- Новая опция позволяет вам установить уровень сообщения, который будет производить вывод команды с ненулевым кодом состояния.
check --fail-level
- Новая опция закрывает команду со статусом, отличным от 0, когда обнаруживаются модификации модели без соответствующей миграции.
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
был добавлен в представление отладки.- Эти
readable()
и методы ,seekable()
которые были добавлены , чтобыHttpResponse
сделать его экземпляр объекта типа потока и дать ему возможность быть адаптирован в класс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()
позволяет принимать во внимание разрешение URL, которое происходит вне цикла запроса / ответа (например, в административных командах и автономных скриптах)FORCE_SCRIPT_NAME
при его определении.
Валидаторы ¶
URLValidator
отныне ограничивает длину частей доменного имени до 63 символов, а общую длину доменных имен до 253 символов, в соответствии с RFC 1034 .int_list_validator()
теперь принимает необязательный логический параметрallow_negative
, установленныйFalse
по умолчанию, чтобы разрешить отрицательные целые числа.
Изменения, несовместимые со старыми версиями Django 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 установил 9.2 как минимальную официально поддерживаемую версию PostgreSQL.
Вывод 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
widgets »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
удален. - Модуль
djangodb.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
.