Примечания к выпуску Django 1.7¶
2 сентября 2014 г.
Добро пожаловать в Джанго 1.7!
Эти примечания к выпуску охватывают новые функции, а также некоторые обратно несовместимые изменения, о которых вам следует знать при обновлении с Django 1.6 или более ранних версий. Мы начали процесс прекращения поддержки некоторых функций, а некоторые функции достигли конца процесса устаревания и были удалены.
Совместимость версий Python¶
Для Django 1.7 требуется Python 2.7, 3.2, 3.3 или 3.4. Мы настоятельно рекомендуем и официально поддерживаем только последнюю версию каждой серии.
Серия Django 1.6 — последняя, поддерживающая Python 2.6. Django 1.7 — первый выпуск, поддерживающий Python 3.4.
Это изменение должно затронуть лишь небольшое количество пользователей Django, поскольку сегодня большинство поставщиков операционных систем поставляют Python 2.7 или новее в качестве версии по умолчанию. Однако, если вы все еще используете Python 2.6, вам придется придерживаться Django 1.6, пока вы не сможете обновить версию Python. Согласно нашей политике поддержки, Django 1.6 будет продолжать получать поддержку безопасности до выпуска Django 1.8.
Что нового в Джанго 1.7¶
Миграции схемы¶
Django теперь имеет встроенную поддержку миграции схем. Он позволяет обновлять, изменять и удалять модели путем создания файлов миграции, которые отражают изменения модели и которые можно запускать в любой базе данных разработки, промежуточной или производственной базы данных.
Миграции описаны в собственной документации, но вот некоторые ключевые особенности:
syncdbустарел и заменен наmigrate. Не волнуйтесь, вызовыsyncdbбудут работать как прежде.Новая команда makemigrations предоставляет простой способ автоматического обнаружения изменений в ваших моделях и выполнения для них миграции.
django.db.models.signals.pre_syncdbиdjango.db.models.signals.post_syncdbустарели и заменены наpre_migrateиpost_migrateсоответственно. Эти новые сигналы имеют несколько иные аргументы. Подробности смотрите в документации.Методallow_syncdb на маршрутизаторах баз данных теперь называетсяallow_migrate, но по-прежнему выполняет ту же функцию. Маршрутизаторы с методами
allow_syncdbпо-прежнему будут работать, но это имя метода устарело, и вам следует изменить его как можно скорее (не требуется ничего, кроме переименования).Фикстуры
initial_dataбольше не загружаются для приложений с миграцией; Если вы хотите загрузить исходные данные для приложения, мы предлагаем вам создать миграцию для вашего приложения и определить операциюRunPythonилиRunSQLв разделеoperationsмиграции.Поведение теста отката отличается для приложений с миграцией; в частности, Django больше не будет эмулировать откаты в нетранзакционных базах данных или внутри TransactionTestCase , если специально не запрошено.
Не рекомендуется, чтобы приложения без миграции зависели от приложений с миграциями (имели
ForeignKeyилиManyToManyFieldto).
Рефакторинг загрузки приложений¶
Исторически приложения Django были тесно связаны с моделями. Синглтон, известный как «кэш приложений», обрабатывал как установленные приложения, так и модели. Модуль моделей использовался в качестве идентификатора приложений во многих API.
По мере развития концепции Приложений Django этот код обнаружил некоторые недостатки. Он был преобразован в «реестр приложений», где модули моделей больше не играют центральной роли и где можно прикреплять данные конфигурации к приложениям.
Улучшения на данный момент включают в себя:
Приложения могут запускать код при запуске, прежде чем Django сделает что-либо еще, с помощью метода
ready()их конфигурации.Метки приложения корректно назначаются моделям, даже если они определены вне файла models.py. Вам больше не нужно явно устанавливать
app_label.Можно полностью опустить файл models.py, если в приложении нет моделей.
Приложения можно переименовывать с помощью атрибута
labelконфигураций приложений, чтобы обойти конфликты меток.Имена приложений можно настроить в администраторе с помощью
verbose_nameконфигураций приложений.Администратор автоматически вызывает
autodiscover()при запуске Django. Следовательно, вы можете удалить эту строку из вашего URLconf.Django импортирует все конфигурации и модели приложения сразу после запуска, используя детерминированный и простой процесс. Это должно облегчить диагностику проблем импорта, таких как циклы импорта.
Новый метод для подклассов Field¶
Чтобы облегчить миграцию схем и упростить добавление составных ключей в будущих выпусках Django, API Field теперь имеет новый обязательный метод: deconstruct().
Этот метод не принимает аргументов и возвращает кортеж из четырех элементов:
name: имя атрибута поля в его родительской модели илиНет, если оно не является частью модели.path: точечный путь Python к классу этого поля, включая имя класса.args: позиционные аргументы в виде списка.kwargs: аргументы ключевых слов в виде диктата.
Эти четыре значения позволяют сериализовать любое поле в файл, а также позволяют безопасно копировать поле — обе важные части этих новых функций.
Это изменение не должно затронуть вас, если вы не пишете собственные подклассы Field; в этом случае вам может потребоваться переопределить метод deconstruct(), если ваш подкласс каким-либо образом изменит сигнатуру метода __init__. Если ваше поле просто наследует встроенное поле Django и не переопределяет __init__, никаких изменений не требуется.
Если вам все же нужно переопределить deconstruct(), лучше всего начать со встроенных полей Django (django/db/models/fields/__init__.py) в виде нескольких полей, включая DecimalField и DateField, переопределить их и показать, как вызывать метод в суперклассе и просто добавлять или удалять дополнительные аргументы.
Это также означает, что все аргументы полей сами по себе должны быть сериализуемыми; Чтобы узнать, что мы считаем сериализуемым, и узнать, как сделать сериализуемыми ваши собственные классы, прочитайте документацию по сериализации миграции.
Вызов пользовательских методов QuerySet из Manager¶
Исторически сложилось так, что рекомендуемым способом создания повторно используемых запросов модели было создание методов в специальном классе Manager. Проблема с этим подходом заключалась в том, что после первого вызова метода вы возвращали экземпляр QuerySet и не могли вызывать дополнительные методы пользовательского менеджера.
Хотя это и не документировано, эту проблему обычно решали путем создания специального QuerySet, чтобы пользовательские методы могли быть объединены в цепочку; но решение имело ряд недостатков:
Пользовательский
QuerySetи его пользовательские методы были потеряны после первого вызоваvalues()илиvalues_list().Написание собственного
Managerпо-прежнему было необходимо для возврата пользовательского классаQuerySet, и все методы, которые были нужны дляManager, должны были быть проксированы вQuerySet. Весь процесс противоречил принципу DRY.
Метод класса QuerySet.as_manager() теперь может напрямую создать Manager с помощью методов QuerySet:
class FoodQuerySet(models.QuerySet):
def pizzas(self):
return self.filter(kind='pizza')
def vegetarian(self):
return self.filter(vegetarian=True)
class Food(models.Model):
kind = models.CharField(max_length=50)
vegetarian = models.BooleanField(default=False)
objects = FoodQuerySet.as_manager()
Food.objects.pizzas().vegetarian()
Использование специального менеджера при обходе обратных отношений¶
Теперь можно указать собственный менеджер при прохождении обратной связи:
class Blog(models.Model):
pass
class Entry(models.Model):
blog = models.ForeignKey(Blog)
objects = models.Manager() # Default Manager
entries = EntryManager() # Custom Manager
b = Blog.objects.get(id=1)
b.entry_set(manager='entries').all()
Новая система проверки системы¶
Мы добавили новую Системную систему проверки для обнаружения распространенных проблем (например, недопустимых моделей) и предоставления подсказок по их решению. Платформа является расширяемой, поэтому вы можете добавлять собственные проверки для своих приложений и библиотек.
Для выполнения системных проверок вы используете команду управления check. Эта команда заменяет старую команду управления validate.
Ярлыки администратора поддерживают часовые пояса¶
Ярлыки «сегодня» и «сейчас» рядом с виджетами ввода даты и времени в администраторе теперь работают в текущем часовом поясе. Раньше они использовали часовой пояс браузера, что могло привести к сохранению неправильного значения, если оно не соответствовало текущему часовому поясу на сервере.
Кроме того, виджеты теперь отображают справочное сообщение, если часовой пояс браузера и сервера различаются, чтобы уточнить, как будет интерпретироваться значение, вставленное в поле.
Использование курсоров базы данных в качестве менеджеров контекста¶
До Python 2.7 курсоры базы данных можно было использовать в качестве менеджера контекста. Курсор конкретного бэкэнда определял поведение контекстного менеджера. Поведение поиска магических методов было изменено в Python 2.7, и курсоры больше нельзя было использовать в качестве менеджеров контекста.
Django 1.7 позволяет использовать курсор в качестве менеджера контекста. То есть можно использовать следующее:
with connection.cursor() as c:
c.execute(...)
вместо:
c = connection.cursor()
try:
c.execute(...)
finally:
c.close()
Пользовательские поиски¶
Теперь можно писать собственные поиски и преобразования для ORM. Пользовательские поисковые запросы работают так же, как встроенные поисковые запросы Django (например, lte, icontains), а преобразования — это новая концепция.
Класс django.db.models.Lookup предоставляет возможность добавлять операторы поиска для полей модели. В качестве примера можно добавить оператор day_lte для DateFields.
Класс django.db.models.Transform позволяет преобразовывать значения базы данных перед окончательным поиском. Например, можно написать преобразование «год», которое извлекает год из значения поля. Преобразования позволяют создавать цепочки. После добавления преобразования year в DateField можно фильтровать преобразованное значение, например qs.filter(author__birthdate__year__lte=1981).
Дополнительную информацию о пользовательских поисках и преобразованиях см. в документации пользовательских поисков.
Улучшения в обработке ошибок формы.¶
Form.add_error()¶
Ранее существовало два основных шаблона обработки ошибок в формах:
Вызов
ValidationErrorиз определенных функций (например,Field.clean(),Form.clean_<fieldname>()илиForm.clean()для ошибок, не связанных с полем.)Возни с Form._errors при выборе определенного поля в Form.clean() или добавлении ошибок из-за пределов «чистого» метода (например, непосредственно из представления).
Использование первого шаблона было простым, поскольку форма могла по контексту (т. е. какой метод вызвал исключение) определить местонахождение ошибок и автоматически обработать их. Это остается каноническим способом добавления ошибок, когда это возможно. Однако последнее было трудоемким и подверженным ошибкам, поскольку бремя обработки крайних случаев ложилось на пользователя.
Новый метод add_error() позволяет добавлять ошибки в определенные поля формы из любого места, не беспокоясь о таких деталях, как создание экземпляров django.forms.utils.ErrorList или работа с Form.cleaned_data. Этот новый API заменяет манипулирование Form._errors, которое теперь становится частным API.
См. Очистка и проверка полей, которые зависят друг от друга для примера использования Form.add_error().
Метаданные ошибки¶
Конструктор ValidationError принимает метаданные, такие как код или параметры ошибки, которые затем доступны для интерполяции в сообщение об ошибке (более подробную информацию см. в Вызов ValidationError); однако до Django 1.7 эти метаданные отбрасывались, как только ошибки были добавлены в Form.errors.
Form.errors и django.forms.utils.ErrorList теперь хранят экземпляры ValidationError, поэтому эти метаданные можно получить в любое время с помощью нового метода Form.errors.as_data.
Полученные экземпляры ValidationError затем можно идентифицировать благодаря их коду ошибки, который позволяет перезаписывать сообщение об ошибке или писать собственную логику в представлении при наличии данной ошибки. Его также можно использовать для сериализации ошибок в пользовательском формате, например XML.
Новый метод Form.errors.as_json() — это удобный метод, который возвращает сообщения об ошибках вместе с кодами ошибок, сериализованными в формате JSON. as_json() использует as_data() и дает представление о том, как можно расширить новую систему.
Контейнеры ошибок и обратная совместимость¶
Для поддержки вышеперечисленных функций были необходимы серьезные изменения в различных контейнерах ошибок, в частности в Form.errors, django.forms.utils.ErrorList и во внутренних хранилищах ValidationError. Эти контейнеры, которые раньше хранили строки ошибок, теперь хранят экземпляры ValidationError, а общедоступные API были адаптированы, чтобы сделать это максимально прозрачным, но если вы использовали частные API, некоторые изменения будут обратно несовместимы; более подробную информацию см. в Конструктор ValidationError и внутреннее хранилище.
Минорные изменения¶
django.contrib.admin¶
Теперь вы можете реализовать
site_header,site_titleиindex_titleв пользовательских атрибутахAdminSite, чтобы их можно было легко изменить. заголовок страницы и текст заголовка сайта администратора. Больше не нужно переопределять шаблоны!Кнопки в
django.contrib.adminтеперь используют CSS-свойствоborder-radiusдля закругленных углов, а не фоновых изображений GIF.Некоторые шаблоны администратора теперь имеют классы
app-<app_name>иmodel-<model_name>в теге<body>, что позволяет настраивать CSS для каждого приложения или модели.Ячейки списка изменений администратора теперь имеют класс
field-<field_name>в HTML, позволяющий настраивать стиль.Поля поиска администратора теперь можно настраивать для каждого запроса благодаря новому методу
django.contrib.admin.ModelAdmin.get_search_fields().Метод
ModelAdmin.get_fields()может быть переопределен для настройки значенияModelAdmin.fields.В дополнение к существующему синтаксису
admin.site.registerвы можете использовать новый декораторregister()для регистрацииModelAdmin.Вы можете указать
ModelAdmin.list_display_links <django.contrib.admin.ModelAdmin.list_display_links>```= None`(), чтобы отключить ссылки в сетке страницы списка изменений.Теперь вы можете указать
ModelAdmin.view_on_site, чтобы контролировать, отображать или нет ссылку «Просмотр на сайте».Вы можете указать порядок убывания для значения
ModelAdmin.list_display, добавив к значениюadmin_order_fieldдефис.Метод
ModelAdmin.get_changeform_initial_data()может быть переопределен, чтобы определить пользовательское поведение для установки начальных данных формы изменения.
django.contrib.auth¶
Любые
**kwargs, передаваемые вemail_user(), передаются базовому вызовуsend_mail().Декоратор
permission_required()может принимать как список разрешений, так и одно разрешение.Вы можете переопределить новый метод
AuthenticationForm.confirm_login_allowed(), чтобы упростить настройку политики входа в систему.django.contrib.auth.views.password_reset()принимает необязательный параметрhtml_email_template_name, используемый для отправки составного электронного письма в формате HTML для сброса пароля.Был добавлен метод
AbstractBaseUser.get_session_auth_hash(), и если вашAUTH_USER_MODELнаследует отAbstractBaseUser, изменение пароля пользователя теперь делает недействительными старые сеансы, если включенdjango.contrib.auth.middleware.SessionAuthenticationMiddleware. Дополнительную информацию см. в разделе Сброс сессии при изменении пароля.
django.contrib.formtools¶
Вызовы «WizardView.done()» теперь включают «form_dict», чтобы упростить доступ к формам по их имени шага.
django.contrib.gis¶
Версия библиотеки OpenLayers по умолчанию, включенная в виджеты, была обновлена с 2.11 до 2.13.
Подготовленные геометрии теперь также поддерживают предикаты
кресты,непересекающиеся,перекрытия,касанияивнутри, если установлена GEOS 3.3 или более поздняя версия.
django.contrib.messages¶
Серверные части
django.contrib.messages, использующие файлы cookie, теперь будут следовать настройкамSESSION_COOKIE_SECUREиSESSION_COOKIE_HTTPONLY.Контекстный процессор сообщений теперь добавляет словарь уровней по умолчанию под именем
DEFAULT_MESSAGE_LEVELS.Messageobjects now have alevel_tagattribute that contains the string representation of the message level.
django.contrib.redirects¶
RedirectFallbackMiddlewareимеет два новых атрибута (response_gone_classиresponse_redirect_class), которые определяют типы экземпляровHttpResponse, возвращаемых промежуточным программным обеспечением.
django.contrib.sessions¶
Серверная часть сеанса
"django.contrib.sessions.backends.cached_db"теперь учитываетSESSION_CACHE_ALIAS. В предыдущих версиях всегда использовался кеш «по умолчанию».
django.contrib.sitemaps¶
sitemap frameworkтеперь используетlastmodдля установки заголовкаLast-Modifiedв ответе. Это позволяетConditionalGetMiddlewareобрабатывать условные запросыGETдля карт сайта, которые устанавливаютlastmod.
django.contrib.sites¶
Новый
django.contrib.sites.middleware.CurrentSiteMiddlewareпозволяет устанавливать текущий сайт при каждом запросе.
django.contrib.staticfiles¶
Классы хранения статических файлов могут быть разделены на подклассы для переопределения разрешений, которые получают собранные статические файлы и каталоги, путем установки
file_permissions_modeиdirectory_permissions_modeпараметры. См. пример использованияcollectstatic.Бэкэнд
CachedStaticFilesStorageполучает родственный класс под названиемManifestStaticFilesStorage, который вообще не использует систему кэширования, а вместо этого использует файл JSON с именемstaticfiles.jsonдля хранения сопоставления между исходным именем файла (например,css/styles.css) и хешированным именем файла. (например, «css/styles.55e7cbb9ba48.css»). Файл staticfiles.json создается при запуске команды управления :djadmin:collectstatic и должен быть менее дорогой альтернативой для удаленных хранилищ, таких как Amazon S3.Дополнительную информацию смотрите в документации
ManifestStaticFilesStorage.findstaticтеперь принимает флаг детализации уровня 2, что означает, что он будет показывать относительные пути к каталогам, в которых он искал. См. пример выводаfindstatic.
Кэш¶
Доступ к кешам, настроенным в
CACHES, теперь доступен черезdjango.core.cache.caches. Этот объект, похожий на dict, предоставляет отдельный экземпляр для каждого потока. Он заменяет django.core.cache.get_cache(), который сейчас устарел.Если вы создаете экземпляры бэкендов кэша напрямую, имейте в виду, что они больше не являются потокобезопасными, поскольку
django.core.cache.cachesтеперь создает разные экземпляры для каждого потока.Если определить для аргумента
TIMEOUTпараметраCACHESзначениеNone, ключи кэша по умолчанию будут установлены как «не истекающие». Раньше можно было передать толькоtimeout=Noneв методset()кэша.
Подделка межсайтового запроса¶
Параметр
CSRF_COOKIE_AGEоблегчает использование файлов cookie CSRF на основе сеанса.
Электронная почта¶
send_mail()теперь принимает параметрhtml_messageдля отправки составного электронного письма text/plain и text/html.SMTP
EmailBackendтеперь принимает параметрtimeout.
Хранение файлов¶
Блокировка файлов в Windows ранее зависела от пакета PyWin32; если он не был установлен, блокировка файлов не удалась автоматически. Эта зависимость была удалена, и блокировка файлов теперь встроена как в Windows, так и в Unix.
Загрузка файлов¶
Новый атрибут
UploadedFile.content_type_extraсодержит дополнительные параметры, передаваемые в заголовокcontent-typeпри загрузке файла.Новый параметр
FILE_UPLOAD_DIRECTORY_PERMISSIONSконтролирует разрешения файловой системы для каталогов, созданных во время загрузки файлов, так же, какFILE_UPLOAD_PERMISSIONSделает это для самих файлов.Атрибут
FileField.upload_toтеперь является необязательным. Если он опущен, заданNoneили пустая строка, подкаталог не будет использоваться для хранения загруженных файлов.Загруженные файлы теперь явно закрываются перед доставкой ответа клиенту. Частично загруженные файлы также закрываются, если в обработчике загрузки им присвоено имя «file».
Storage.get_available_name()теперь добавляет подчеркивание плюс случайную буквенно-цифровую строку из 7 символов (например,"_x3a1gho"), а не перебирает подчеркивание, за которым следует число (например,"_1","_2", и т. д.), чтобы предотвратить атаку типа «отказ в обслуживании». Это изменение также было внесено в выпуски безопасности 1.6.6, 1.5.9 и 1.4.14.
Формы¶
Теги
<label>и<input>, отображаемые с помощьюRadioSelectиCheckboxSelectMultipleпри циклическом переборе переключателей или флажков, теперь включают атрибутыforиidсоответственно. Каждый переключатель или флажок включает атрибут id_for_label для вывода идентификатора элемента.Теги
<textarea>, отображаемые с помощьюTextarea, теперь включают атрибутmaxlength, если поле моделиTextFieldимеетmax_length.Field.choicesтеперь позволяет вам настроить метку «пустого выбора», включив кортеж с пустой строкой илиNoneдля ключа и пользовательскую метку в качестве значения. Пустая опция по умолчанию"----------"в этом случае будет опущена.MultiValueFieldпозволяет использовать необязательные подполя, устанавливая для аргументаrequire_all_fieldsзначениеFalse. Атрибутrequiredдля каждого отдельного поля будет соблюдаться, и новая ошибка проверкиincompleteбудет выдана, если какие-либо обязательные поля пусты.Методу
clean()в форме больше не требуется возвращатьself.cleaned_data. Если он вернет измененный словарь, он все равно будет использоваться.После временного регресса в Django 1.6 теперь снова можно заставить метод
TypedChoiceFieldcoerceвозвращать произвольное значение.SelectDateWidget.monthsможно использовать для настройки формулировок месяцев, отображаемых в виджете выбора.Параметры min_num и validate_min были добавлены в
formset_factory(), чтобы позволить проверять минимальное количество отправленных форм.Метаклассы, используемые Form и ModelForm, были переработаны для поддержки большего количества сценариев наследования. Предыдущее ограничение, которое не позволяло одновременно наследовать как Form, так и ModelForm, было удалено, пока ModelForm появляется первым в MRO.
Теперь можно удалить поле из «Формы» при создании подкласса, установив для имени значение «Нет».
Теперь можно настроить сообщения об ошибках для ограничений
unique,unique_for_dateиunique_togetherв ModelForm. Для поддержки unique_together или любого другого NON_FIELD_ERROR, ModelForm теперь ищет ключ NON_FIELD_ERROR в словаре error_messages внутреннего класса Meta ModelForm. См. соображения относительно error_messages модели для получения более подробной информации.
Интернационализация¶
Атрибут
django.middleware.locale.LocaleMiddleware.response_redirect_classпозволяет вам настроить перенаправления, выполняемые промежуточным программным обеспечением.The
LocaleMiddlewarenow stores the user’s selected language with the session key_language. This should only be accessed using theLANGUAGE_SESSION_KEYconstant. Previously it was stored with the keydjango_languageand theLANGUAGE_SESSION_KEYconstant did not exist, but keys reserved for Django should start with an underscore. For backwards compatibilitydjango_languageis still read from in 1.7. Sessions will be migrated to the new key as they are written.The
blocktranstag now supports atrimmedoption. This option will remove newline characters from the beginning and the end of the content of the{% blocktrans %}tag, replace any whitespace at the beginning and end of a line and merge all lines into one using a space character to separate them. This is quite useful for indenting the content of a{% blocktrans %}tag without having the indentation characters end up in the corresponding entry in the PO file, which makes the translation process easier.Когда вы запускаете
makemessagesиз корневого каталога вашего проекта, все извлеченные строки теперь будут автоматически распространяться в соответствующий файл сообщений приложения или проекта. Подробности смотрите в разделе «Как создавать языковые файлы».The
makemessagescommand now always adds the--previouscommand line flag to themsgmergecommand, keeping previously translated strings in po files for fuzzy strings.Были введены следующие настройки для настройки языковых параметров cookie:
LANGUAGE_COOKIE_AGE,LANGUAGE_COOKIE_DOMAINиLANGUAGE_COOKIE_PATH.Добавлен /topics/i18n/formating для эсперанто.
Команды управления¶
Новая опция
--no-colorдляdjango-adminотключает раскрашивание вывода команд управления.Новые параметры
dumpdata --natural-foreignиdumpdata --natural-primary, а также новые аргументыuse_natural_foreign_keysиuse_natural_primary_keysдляserializers.serialize()позволяют использовать естественные первичные ключи при сериализации.Больше нет необходимости указывать имя таблицы кэша или опцию –database для команды
createcachetable. Django берет эту информацию из вашего файла настроек. Если вы настроили несколько кэшей или несколько баз данных, будут созданы все таблицы кэша.Команда
runserverполучила несколько улучшений:On Linux systems, if pyinotify is installed, the development server will reload immediately when a file is changed. Previously, it polled the filesystem for changes every second. That caused a small delay before reloads and reduced battery life on laptops.
Кроме того, сервер разработки автоматически перезагружается при обновлении файла перевода, то есть после запуска
compilemessages.Все HTTP-запросы регистрируются в консоли, включая запросы к статическим файлам или favicon.ico, которые раньше отфильтровывались.
Команды управления теперь могут выводить цветной синтаксический вывод в Windows, если сторонний инструмент ANSICON установлен и активен.
collectstaticкоманда с опцией символической ссылки теперь поддерживается в Windows NT 6 (Windows Vista и новее).Initial SQL data now works better if the sqlparse Python library is installed.
Обратите внимание, что он устарел в пользу операции миграции
RunSQL, которая выигрывает от улучшенного поведения.
Модели¶
Был добавлен метод
QuerySet.update_or_create().Новая опция «Meta» модели
default_permissionsпозволяет вам настроить (или отключить) создание разрешений на добавление, изменение и удаление по умолчанию.Явное
OneToOneFieldдля Multi-table наследование теперь обнаруживается в абстрактных классах.Теперь можно избежать создания обратного отношения для
OneToOneField, установив для егоrelated_nameзначение'+'или закончив его'+'.F-выраженияподдерживают оператор степени (**).Методы
remove()иclear()связанных менеджеров, созданных с помощьюForeignKeyиGenericForeignKey, теперь принимают аргумент ключевого словаbulk, чтобы контролировать, следует ли выполнять массовые операции (т. е. использоватьQuerySet.update()). По умолчанию установленоTrue.Теперь можно использовать None в качестве значения запроса для поиска
iexact.Теперь можно передать вызываемый объект в качестве значения атрибута
limit_choices_toпри определенииForeignKeyилиManyToManyField.Вызов
only()иdefer()по результатуQuerySet.values()теперь вызывает ошибку (ранее это приводило либо к ошибке базы данных, либо к неправильному результату). данные).You can use a single list for
index_together(rather than a list of lists) when specifying a single set of fields.Пользовательские промежуточные модели, имеющие более одного внешнего ключа для любой из моделей, участвующих в отношениях «многие-ко-многим», теперь разрешены при условии, что вы явно укажете, какие внешние ключи следует использовать, установив новый аргумент
ManyToManyField.through_fields.Присвоение экземпляра модели полю, не имеющему отношения, теперь будет вызывать ошибку. Раньше это работало, если поле принимало целые числа в качестве входных данных, поскольку оно принимало первичный ключ.
Целочисленные поля теперь проверяются на соответствие минимальным и максимальным значениям, специфичным для серверной части базы данных, на основе их
internal_type. Ранее проверка поля модели не препятствовала сохранению значений за пределами диапазона типов данных связанного столбца, что приводило к ошибке целостности.Теперь можно явно
order_by()использовать поле_idотношения, используя имя его атрибута.
Сигналы¶
К сигналу
setting_changedбыл добавлен аргументenter.Сигналы модели теперь можно подключить с помощью str формы app_label.ModelName – точно так же, как и связанные поля – для ленивой ссылки на отправителей.
Шаблоны¶
Метод
Context.push()теперь возвращает контекстный менеджер, который автоматически вызываетpop()при выходе из оператораwith. Кроме того,push()теперь принимает параметры, которые передаются конструкторуdict, используемому для построения нового уровня контекста.Новый метод
Context.flatten()возвращает стекContextкак один плоский словарь.Объекты
Contextтеперь можно сравнивать на предмет равенства (внутренне это используетContext.flatten(), поэтому внутренняя структура каждого стекаContextне имеет значения, пока их сглаженная версия идентична).Тег шаблона
widthratioтеперь принимает параметр"as"для фиксации результата в переменной.Тег шаблона
includeтеперь также будет принимать в качестве аргумента все, что имеет методrender()(например,Template). Строковые аргументы будут искаться с помощьюget_template(), как всегда.Теперь можно рекурсивно
includeшаблоны.У объектов шаблона теперь установлен атрибут происхождения, если TEMPLATE_DEBUG имеет значение True. Это позволяет проверять и регистрировать происхождение шаблонов вне инфраструктуры django.template.
Исключения
TypeErrorбольше не отключаются при возникновении во время рендеринга шаблона.Следующие функции теперь принимают параметр
dirs, который представляет собой список или кортеж для переопределенияTEMPLATE_DIRS:django.shortcuts.render_to_response()
Фильтр
timeтеперь принимает спецификаторы формата, связанные с часовым поясом, <naive_vs_aware_datetimes, ожидаемый рендеринг.Тег
cacheтеперь попытается использовать кеш с именем «template_fragments», если он существует, и в противном случае вернется к использованию кеша по умолчанию. Он также теперь принимает необязательный аргумент ключевого слова using для управления тем, какой кеш он использует.Новый фильтр
truncatechars_htmlусекает строку, чтобы ее длина не превышала заданное количество символов, принимая во внимание HTML.
Запросы и ответы¶
Новый атрибут
HttpRequest.schemeопределяет схему запроса (обычноhttpилиhttps).Ярлык
redirect()теперь поддерживает относительные URL-адреса.Новый подкласс
JsonResponseHttpResponseпомогает легко создавать ответы в кодировке JSON.
Тесты¶
DiscoverRunnerимеет два новых атрибута:test_suiteиtest_runner, которые облегчают переопределение способа сбора и запуска тестов.Аргумент fetch_redirect_response был добавлен в
assertRedirects(). Поскольку тестовый клиент не может получать внешние URL-адреса, это позволяет вам использовать AssertRedirects с перенаправлениями, которые не являются частью вашего приложения Django.Правильная обработка схемы при сравнении в
assertRedirects().Аргумент
secureбыл добавлен ко всем методам запросаClient. ЕслиTrue, запрос будет выполнен через HTTPS.assertNumQueries()теперь распечатывает список выполненных запросов, если утверждение не удалось.Экземпляр WSGIRequest, созданный обработчиком теста, теперь прикреплен к атрибуту
django.test.Response.wsgi_request.Настройки базы данных для тестирования собраны в словарь с именем
TEST.
Утилиты¶
Улучшена точность
strip_tags()(но по-прежнему не может гарантировать HTML-безопасный результат, как указано в документации).
Валидаторы¶
RegexValidatorтеперь принимает необязательныеflagsи логическиеinverse_matchаргументы. Атрибутinverse_matchопределяет, должен ли вызыватьсяValidationError, когда шаблон регулярного выражения соответствует (True) или не соответствует (False, по умолчанию) предоставленномуvalue. Атрибутflagsустанавливает флаги, используемые при компиляции строки регулярного выражения.URLValidatorтеперь принимает необязательный аргументschemes, который позволяет настраивать принятые схемы URI (вместо стандартныхhttp(s)иftp(s)).validate_email()теперь принимает адреса с литералами IPv6, напримерexample@[2001:db8::1], как указано в RFC 5321.
Изменения обратной несовместимости в версии 1.7¶
Предупреждение
Помимо изменений, описанных в этом разделе, обязательно просмотрите план прекращения поддержки на предмет всех удаленных функций. Если вы не обновили свой код в течение срока прекращения поддержки определенной функции, ее удаление может выглядеть как обратно несовместимое изменение.
allow_syncdb / allow_migrate¶
Хотя Django по-прежнему будет использовать методыallow_syncdb, даже если они должны быть переименованы вallow_migrate, существует небольшая разница в том, какие модели передаются этим методам.
Для приложений с миграцией теперь allow_migrate будет передаваться исторические модели, которые представляют собой модели со специальными версиями без пользовательских атрибутов, методов или менеджеров. Убедитесь, что ваши методыallow_migrate относятся только к полям или другим элементам в model._meta.
начальные_данные¶
Приложения с миграцией не будут загружать фикстуры initial_data после завершения миграции. Приложения без миграции будут продолжать загружать эти настройки на этапе миграции, который эмулирует старое поведение syncdb, но любые новые приложения не будут иметь такой поддержки.
Вместо этого вам рекомендуется загружать исходные данные при миграции, если они вам нужны (используя операцию RunPython и классы вашей модели); это имеет дополнительное преимущество: ваши исходные данные не будут нуждаться в обновлении каждый раз при изменении схемы.
Кроме того, как и остальная часть старого кода syncdb Django, initial_data устарела и будет удалена в Django 1.9.
deconstruct() and serializability¶
Django now requires all Field classes and all of their constructor arguments to be serializable. If you modify the constructor signature in your custom Field in any way, you’ll need to implement a deconstruct() method; we’ve expanded the custom field documentation with instructions on implementing this method.
Требование, чтобы все аргументы поля были serializable, означает, что любые экземпляры пользовательских классов, передаваемые в конструкторы Field - например, такие как пользовательские подклассы Storage - должны также иметь deconstruct метод, определенный для них, а также, хотя Django предоставляет удобный декоратор классов, который будет работать для большинства приложений.
Изменения в загрузке приложений¶
Последовательность запуска¶
Django 1.7 загружает конфигурации и модели приложений сразу после запуска. Хотя такое поведение является более простым и считается более надежным, нельзя исключать возможность регрессии. См. Решение проблем для решения некоторых проблем, с которыми вы можете столкнуться.
Автономные скрипты¶
If you’re using Django in a plain Python script — rather than a management
command — and you rely on the DJANGO_SETTINGS_MODULE environment
variable, you must now explicitly initialize Django at the beginning of your
script with:
>>> import django
>>> django.setup()
В противном случае вы получите исключение AppRegistryNotReady.
WSGI-скрипты¶
До Django 1.3 рекомендуемый способ создания приложения WSGI был:
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
В Django 1.4 была улучшена поддержка WSGI, а API изменен на:
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
Если вы все еще используете первый стиль в своем WSGI-скрипте, вам необходимо перейти на второй, иначе вы столкнетесь с исключением AppRegistryNotReady.
Согласованность реестра приложений¶
Больше невозможно иметь несколько установленных приложений с одной и той же меткой. В предыдущих версиях Django это не всегда работало правильно, но и не приводило к сбоям.
Если у вас есть два приложения с одинаковой меткой, вам следует создать AppConfig для одного из них и переопределить его label там. Затем вам следует изменить свой код везде, где он ссылается на это приложение или его модели со старой меткой.
Больше невозможно импортировать одну и ту же модель дважды разными путями. Начиная с Django 1.6, это может произойти, только если вы вручную помещаете каталог и подкаталог в PYTHONPATH. Инструкции по миграции см. в разделе о новом макете проекта в примечаниях к выпуску 1.4.
Вы должны убедиться, что:
Все модели определены в приложениях, которые перечислены в
INSTALLED_APPSили имеют явныйapp_label.Модели не импортируются как побочный эффект загрузки их приложения. В частности, не следует импортировать модели ни в корневой модуль приложения, ни в модуль, определяющий его класс конфигурации.
Django будет применять эти требования начиная с версии 1.9 после периода устаревания.
Создание подкласса AppCommand¶
Подклассы AppCommand теперь должны реализовывать метод handle_app_config() вместо handle_app(). Этот метод получает экземпляр AppConfig вместо модуля моделей.
Анализ приложений¶
Поскольку INSTALLED_APPS теперь поддерживает классы конфигурации приложения в дополнение к модулям приложения, вам следует просмотреть код, который обращается к этому параметру напрямую, и вместо этого использовать реестр приложения (django.apps.apps).
Реестр приложений сохранил некоторые функции старого кэша приложений. Несмотря на то, что кеш приложения был частным API, устаревшие методы и аргументы будут удалены стандартным путем, за исключением следующих изменений, которые вступают в силу немедленно:
get_modelвызываетLookupErrorвместо возвратаNone, когда модель не найдена.Аргумент only_installed для get_model и get_models больше не существует, равно как и аргументseed_cache для get_model.
Команды управления и порядок установки INSTALLED_APPS¶
Когда несколько приложений предоставляют команды управления с одинаковым именем, Django загружает команду из приложения, которое указано первым в INSTALLED_APPS. Предыдущие версии загружали команду из приложения, которое появлялось последним.
Это приводит к тому, что обнаружение команд управления соответствует другим частям Django, которые зависят от порядка INSTALLED_APPS, таких как статические файлы, шаблоны и переводы.
Конструктор ValidationError и внутреннее хранилище¶
Поведение конструктора ValidationError изменилось, когда он получил в качестве аргумента контейнер ошибок (например, список или ErrorList):
Он преобразует любые найденные строки в экземпляры ValidationError перед добавлением их во внутреннюю память.
Он не сохраняет данный контейнер, а копирует его содержимое в свое внутреннее хранилище; ранее сам контейнер добавлялся к экземпляру ValidationError и использовался в качестве внутреннего хранилища.
Это означает, что если вы получаете доступ к внутренним хранилищам ValidationError, таким как error_list; error_dict; или возвращаемое значение update_error_dict(), вы можете найти экземпляры ValidationError, где вы ранее могли найти строки.
Также, если вы напрямую присвоили возвращаемое значение update_error_dict() для Form._errors, вы можете случайно добавить экземпляры list там, где ожидаются экземпляры ErrorList. Это проблема, потому что в отличие от простого списка, ErrorList знает, как обрабатывать экземпляры ValidationError.
Большинство случаев использования, требующих использования этих частных API, теперь покрываются недавно представленным методом Form.add_error():
# Old pattern:
try:
# ...
except ValidationError as e:
self._errors = e.update_error_dict(self._errors)
# New pattern:
try:
# ...
except ValidationError as e:
self.add_error(None, e)
Если вам нужна совместимость с Django <= 1.6 и 1.7, вы не можете использовать Form.add_error(), поскольку он не был доступен до Django 1.7, но вы можете использовать следующий обходной путь для преобразования любого list в ErrorList:
try:
# ...
except ValidationError as e:
self._errors = e.update_error_dict(self._errors)
# Additional code to ensure ``ErrorDict`` is exclusively
# composed of ``ErrorList`` instances.
for field, error_list in self._errors.items():
if not isinstance(error_list, self.error_class):
self._errors[field] = self.error_class(error_list)
Поведение LocMemCache в отношении ошибок травления¶
В предыдущих версиях Django существовало несоответствие относительно того, как ошибки Pickle обрабатываются различными серверами кэширования. django.core.cache.backends.locmem.LocMemCache используется для молчаливого сбоя при возникновении такой ошибки, что несовместимо с другими бэкэндами и приводит к ошибкам, специфичным для кэша. Это было исправлено в Django 1.7, подробности см. в #21200.
Ключи кэша теперь генерируются на основе абсолютного URL-адреса запроса.¶
Предыдущие версии Django генерировали ключи кэша, используя путь запроса и строку запроса, но не схему или хост. Если приложение Django обслуживало несколько поддоменов или доменов, ключи кэша могли конфликтовать. В Django 1.7 ключи кэша различаются в зависимости от абсолютного URL-адреса запроса, включая схему, хост, путь и строку запроса. Например, URL-часть ключа кэша теперь генерируется из «https://www.example.com/path/to/?key=val», а не из «/path/to/?key=val». Ключи кэша, созданные Django 1.7, будут отличаться от ключей, созданных более старыми версиями Django. После обновления до Django 1.7 первый запрос к любому ранее кэшированному URL-адресу будет промахом в кэше.
Передача None в Manager.db_manager()¶
В предыдущих версиях Django можно было использовать db_manager(using=None) для экземпляра менеджера модели, чтобы получить экземпляр менеджера с использованием поведения маршрутизации по умолчанию, переопределяя любую маршрутизацию базы данных, заданную вручную. В Django 1.7 значение None, переданное в db_manager, создаст маршрутизатор, который сохраняет любую назначенную вручную маршрутизацию базы данных — менеджер не сбрасывается. Это было необходимо для устранения несогласованности в способе каскадной передачи информации о маршрутизации по соединениям. Подробнее см. в #13724.
pytz may be required¶
If your project handles datetimes before 1970 or after 2037 and Django raises
a ValueError when encountering them, you will have to install pytz. You
may be affected by this problem if you use Django’s time zone-related date
formats or django.contrib.syndication.
Стратегия перенаправления входа администратора¶
Исторически сайт администрирования Django передавал запрос от неавторизованного или неаутентифицированного пользователя непосредственно в представление входа в систему без перенаправления HTTP. В Django 1.7 это поведение изменилось, чтобы соответствовать более традиционному рабочему процессу, где любой несанкционированный запрос к странице администратора будет перенаправлен (по коду состояния HTTP 302) на страницу входа, с параметром next, установленным на ссылающийся путь. Туда пользователь будет перенаправлен после успешного входа в систему.
Также обратите внимание, что форма входа администратора была обновлена и теперь не содержит поля this_is_the_login_form (теперь не используемого), а для кода ValidationError был установлен более обычный ключ invalid_login.
select_for_update() требует транзакции¶
Исторически запросы, использующие select_for_update(), могли выполняться в режиме автоматической фиксации вне транзакции. До Django 1.6 режим автоматических транзакций Django позволял использовать его для блокировки записей до следующей операции записи. В Django 1.6 появилась автофиксация на уровне базы данных; с тех пор выполнение в таком контексте аннулирует эффект select_for_update(). Таким образом, теперь предполагается, что это ошибка и вызывает исключение.
Это изменение было сделано потому, что такие ошибки могут быть вызваны включением приложения, которое ожидает глобальных транзакций (например, ATOMIC_REQUESTS со значением True) или старым поведением автофиксации Django в проекте, который работает без них; кроме того, такие ошибки могут проявляться как ошибки, приводящие к повреждению данных. Это также было сделано в Django 1.6.3.
Это изменение может привести к сбою теста, если вы используете select_for_update() в тестовом классе, который является подклассом TransactionTestCase, а не TestCase.
Промежуточное программное обеспечение Contrib удалено из стандартного MIDDLEWARE_CLASSES.¶
Рефакторинг app-loading устарел с использованием моделей из приложений, которые не являются частью настройки INSTALLED_APPS. Это выявило несовместимость между настройкой по умолчанию INSTALLED_APPS и MIDDLEWARE_CLASSES в глобальных настройках по умолчанию (django.conf.global_settings). Чтобы синхронизировать эти настройки и предотвратить предупреждения об устаревании при выполнении таких действий, как тестирование повторно используемых приложений с минимальными настройками, SessionMiddleware, AuthenticationMiddleware, и MessageMiddleware были удалены из значений по умолчанию. Эти классы по-прежнему будут включены в настройки по умолчанию, созданные startproject. Это изменение не повлияет на большинство проектов, но если вы ранее не объявляли MIDDLEWARE_CLASSES в настройках вашего проекта и не полагались на глобальное значение по умолчанию, вам следует убедиться, что новые значения по умолчанию соответствуют потребностям вашего проекта. Вам также следует проверить наличие кода, который обращается напрямую к django.conf.global_settings.MIDDLEWARE_CLASSES.
Разнообразный¶
Методу
django.core.files.uploadhandler.FileUploadHandler.new_file()теперь передается дополнительный параметрcontent_type_extra. Если у вас есть собственныйFileUploadHandler, реализующийnew_file(), убедитесь, что он принимает этот новый параметр.ModelFormSets больше не удаляет экземпляры при вызовеsave(commit=False). См.can_deleteдля получения инструкций о том, как вручную удалять объекты из удаленных форм.Загрузка пустых фикстур выдает
RuntimeWarning, а не вызываетCommandError.django.contrib.staticfiles.views.serve()теперь вызывает исключениеHttp404вместоImproperlyConfigured, когдаDEBUGимеет значениеFalse. Это изменение устраняет необходимость условно добавлять представление в корневой URLconf, что, в свою очередь, делает его безопасным для обратного изменения по имени. Он также лишает посетителей возможности генерировать ложные ошибки HTTP 500, запрашивая статические файлы, которые не существуют или еще не были собраны.Метод
django.db.models.Model.__eq__()теперь определен таким образом, что экземпляры прокси-модели и ее базовой модели считаются равными при совпадении первичных ключей. Раньше только экземпляры одного и того же класса считались равными при совпадении первичного ключа.Метод
django.db.models.Model.__eq__()изменился таким образом, что два экземпляраModelбез значений первичного ключа не будут считаться равными (если только они не являются одним и тем же экземпляром).Метод
django.db.models.Model.__hash__()теперь будет вызыватьTypeErrorпри вызове в экземпляре без значения первичного ключа. Это сделано для того, чтобы избежать изменяемых значений__hash__в контейнерах.AutoFieldСтолбцы в базах данных SQLite теперь будут создаваться с использованием опцииAUTOINCREMENT, которая гарантирует монотонное приращение. Это приведет к изменению поведения нумерации первичных ключей в SQLite, которое станет совместимым с большинством других баз данных SQL. Это будет применяться только к вновь созданным таблицам. Если у вас есть база данных, созданная с помощью более старой версии Django, вам потребуется перенести ее, чтобы воспользоваться этой функцией. Например, вы можете сделать следующее:django.contrib.auth.models.AbstractUserбольше не определяет методget_absolute_url(). Старое определение возвращало"/users/%s/" % urlquote(self.username), что было произвольным, поскольку приложения могут определять или не определять такой URL-адрес вurlpatterns. Определите метод get_absolute_url() для своего собственного пользовательского объекта или используйтеABSOLUTE_URL_OVERRIDES, если вам нужен URL-адрес для вашего пользователя.Статическая функциональность обслуживания ресурсов класса
django.test.LiveServerTestCaseбыла упрощена: теперь он может обслуживать только контент, уже присутствующий вSTATIC_ROOT, при запуске тестов. Возможность прозрачного обслуживания всех статических ресурсов (аналогично тому, что можно получить с помощьюDEBUG = Trueво время разработки) была перенесена в новый класс, который находится в приложенииstaticfiles(тот, который фактически отвечает за такую функцию):django.contrib.staticfiles.testing.StaticLiveServerTestCase. Другими словами, LiveServerTestCase сам по себе менее мощный, но в то же время в нем меньше магии.Обоснованием этого является устранение зависимости кода, не вносящего вклад, от вносимых приложений.
Старый синтаксис URI кэша (например,
"locmem://") больше не поддерживается. Он по-прежнему работал, хотя и не был задокументирован или официально поддержан. Если вы все еще используете его, обновите синтаксисCACHESдо текущего.Порядок полей «Формы» по умолчанию в случае наследования изменился и теперь соответствует обычному Python MRO. Поля теперь обнаруживаются путем итерации MRO в обратном порядке, при этом самый верхний класс идет последним. Это влияет на вас только в том случае, если вы полагались на порядок полей по умолчанию, имея поля, определенные как в текущем классе *, так и * в родительской
Form.Аргумент
requiredSelectDateWidgetбыл удален. Этот виджет теперь учитывает атрибут is_required поля формы, как и другие виджеты.Widget.is_hiddenтеперь является свойством только для чтения, получая свое значение путем самоанализаinput_type == 'hidden'.select_related()теперь объединяется так же, как и другие подобные вызовы, такие какprefetch_related. То есть select_related(„foo“, „bar“)`` эквивалентенselect_related('foo').select_lated('bar'). Раньше последнее было эквивалентноselect_related('bar').GeoDjango прекратил поддержку GEOS <3.1.
Метод
init_connection_stateсерверной части базы данных теперь выполняется в режиме автофиксации (если вы не установили дляAUTOCOMMITзначениеFalse). Если вы поддерживаете собственную базу данных, вам следует проверить этот метод.Атрибут
django.db.backends.BaseDatabaseFeatures.allows_primary_key_0был переименован вallows_auto_pk_0, чтобы лучше его описать. ЭтоTrueдля всех баз данных, включенных в Django, за исключением MySQL, который разрешает первичные ключи со значением 0. Он запрещает только автоинкремент первичных ключей со значением 0.Затенение полей модели, определенных в родительской модели, запрещено, поскольку это создает неоднозначность в ожидаемом поведении модели. Кроме того, конфликты полей в иерархии наследования модели приводят к ошибке проверки системы. Например, если вы используете множественное наследование, вам необходимо определить собственные поля первичного ключа в родительских моделях, иначе поля id по умолчанию будут конфликтовать. Подробности смотрите в разделе Множественное наследование.
django.utils.translation.parse_accept_lang_header()теперь возвращает локали в нижнем регистре, а не в том регистре, который был предусмотрен. Поскольку локали следует обрабатывать без учета регистра, это позволяет нам ускорить определение локали.django.utils.translation.get_language_from_path()иdjango.utils.translation.trans_real.get_supported_language_variant()больше не имеют аргументаsupported.Представление
shortcutвdjango.contrib.contenttypes.viewsтеперь поддерживает URL-адреса, зависящие от протокола (например,//example.com).GenericRelationтеперь поддерживает необязательный аргумент linked_query_name``. Установка «related_query_name» добавляет связь из связанного объекта обратно к типу контента для фильтрации, упорядочивания и других операций запроса.При запуске тестов на PostgreSQL пользователю
USERпотребуется доступ на чтение к встроенной базе данныхpostgres. Это вместо предыдущего поведения при подключении к фактической нетестовой базе данных.В рамках Системной системы проверки, поля, модели и менеджеры моделей реализуют метод
check(), зарегистрированный в системе проверки. Если у вас есть существующий методcheck()для одного из этих объектов, вам нужно будет переименовать его.Как отмечалось выше в разделе «Кэш» раздела «Второстепенные функции», определение аргумента
TIMEOUTпараметраCACHESкакNoneприведет к установке ключей кэша как «не истекающих». Раньше при использовании бэкенда memcache параметрTIMEOUT, равный0, устанавливал ключи с неограниченным сроком действия, но это несовместимо с поведениемset("key", "value", timeout=0), использующим установку и истечение срока действия (т.е. без кэширования). Если вам нужны ключи с неограниченным сроком действия, обновите настройки, чтобы использовать «Нет» вместо «0», поскольку последний теперь также обозначает в настройках возможность установки и истечения срока действия.Команды управления
sql*теперь учитывают методallow_migrate()DATABASE_ROUTERS. Если у вас есть модели, синхронизированные с базами данных, отличными от стандартных, используйте флаг –database, чтобы получить SQL для этих моделей (ранее они всегда включались в выходные данные).Декодирование строки запроса из URL-адресов теперь возвращается к кодировке ISO-8859-1, если входные данные недействительны в формате UTF-8.
При добавлении django.contrib.auth.middleware.SessionAuthenticationMiddleware к шаблону проекта по умолчанию (только до версии 1.7.2) база данных должна быть создана перед доступом к странице с помощью
runserver.Добавление аргумента
schemesвURLValidatorбудет выглядеть как обратно несовместимое изменение, если вы ранее использовали собственное регулярное выражение для проверки схем. Любая схема, не указанная вschemes, не пройдет проверку, даже если регулярное выражение соответствует данному URL-адресу.
Функции, устаревшие в версии 1.7¶
django.core.cache.get_cache¶
django.core.cache.get_cache был заменен на django.core.cache.cache`.
django.utils.dictconfig/django.utils.importlib¶
django.utils.dictconfig и django.utils.importlib были копиями соответственно logging.config и importlib, предоставленных для версий Python до 2.7. Они устарели.
django.utils.module_loading.import_by_path¶
Текущая функция django.utils.module_loading.import_by_path перехватывает исключения AttributeError, ImportError и ValueError и повторно вызывает :exc:~django.core.Exceptions.ImproperlyConfigured. Такое маскирование исключений усложняет диагностику проблем циклического импорта, поскольку создается впечатление, что проблема исходит изнутри Django. Он устарел в пользу import_string().
django.utils.tzinfo¶
django.utils.tzinfo предоставляет два подкласса tzinfo, LocalTimezone и FixedOffset. Они устарели в пользу более правильных альтернатив, предоставляемых django.utils.timezone, django.utils.timezone.get_default_timezone() и django.utils.timezone.get_fixed_timezone().
django.utils.unittest¶
django.utils.unittest обеспечивал единый доступ к библиотеке unittest2 во всех версиях Python. Поскольку unittest2 стал модулем unittest стандартной библиотеки в Python 2.7, а в Django 1.7 прекращена поддержка старых версий Python, этот модуль больше не полезен. Это устарело. Вместо этого используйте unittest.
django.utils.datastructures.SortedDict¶
Поскольку OrderedDict был добавлен в стандартную библиотеку Python 2.7, SortedDict больше не нужен и устарел.
Два дополнительных устаревших метода, предоставляемых SortedDict (insert() и value_for_index()), были удалены. Если вы полагались на эти методы для изменения структур, таких как поля формы, теперь вам следует рассматривать эти OrderedDict как неизменяемые объекты и переопределять их для изменения их содержимого.
Например, вы можете захотеть переопределить MyFormClass.base_fields (хотя этот атрибут не считается общедоступным API), чтобы изменить порядок полей для всех экземпляров MyFormClass; или аналогичным образом вы можете переопределить self.fields изнутри MyFormClass.__init__(), чтобы изменить поля для конкретного экземпляра формы. Например (из самого Django):
PasswordChangeForm.base_fields = OrderedDict(
(k, PasswordChangeForm.base_fields[k])
for k in ['old_password', 'new_password1', 'new_password2']
)
Пользовательское расположение SQL для пакета моделей¶
Раньше, если модели были организованы в пакет (myapp/models/), а не просто в myapp/models.py, Django искал исходные данные SQL в myapp/models/sql/. Эта ошибка была исправлена, и Django будет выполнять поиск в myapp/sql/, как описано в документации. После устранения этой проблемы были добавлены миграции, которые устарели из-за исходных данных SQL. Таким образом, хотя это изменение все еще существует, прекращение поддержки не имеет значения, поскольку вся функция будет удалена в Django 1.9.
Реорганизация django.contrib.sites¶
django.contrib.sites предоставляет ограниченную функциональность, если ее нет в INSTALLED_APPS. Рефакторинг загрузки приложений добавляет некоторые ограничения в этой ситуации. Как следствие, два объекта были перемещены, а старые местоположения устарели:
RequestSiteтеперь находится вdjango.contrib.sites.requests.get_current_site()теперь находится вdjango.contrib.sites.shortcuts.
Атрибут declared_fieldsets в ModelAdmin¶
ModelAdmin.declared_fieldsets устарел. Несмотря на то, что это частный API, он будет регулярно устаревать. Этот атрибут в основном использовался методами, которые обходили ModelAdmin.get_fieldsets(), но это было сочтено ошибкой и исправлено.
Реорганизация django.contrib.contenttypes¶
Поскольку django.contrib.contenttypes.generic определяет объекты, связанные как с администратором, так и с моделью, импорт этого модуля может вызвать неожиданные побочные эффекты. Как следствие, его содержимое было разделено на подмодули contenttypes, а модуль django.contrib.contenttypes.generic устарел:
GenericForeignKeyиGenericRelationтеперь живут вfields.BaseGenericInlineFormSetиgeneric_inlineformset_factory()теперь живут вforms.GenericInlineModelAdmin,GenericStackedInlineиGenericTabularInlineтеперь живут вadmin.
синкдб¶
Команда syncdb устарела в пользу новой команды migrate. migrate принимает те же аргументы, что и syncdb, плюс еще несколько, поэтому можно безопасно просто изменить имя, по которому вы звоните, и ничего больше.
Модули util переименованы в utils¶
Следующие экземпляры util.py в кодовой базе Django были переименованы в utils.py с целью унифицировать все ссылки на util и utils:
django.contrib.admin.utildjango.contrib.gis.db.backends.utildjango.db.backends.utildjango.forms.util
Метод get_formsets в ModelAdmin¶
ModelAdmin.get_formsets устарел в пользу нового get_formsets_with_inlines(), чтобы лучше обрабатывать случай выборочного отображения встроенных строк в ModelAdmin.
IPAddressField¶
Поля django.db.models.IPAddressField и django.forms.IPAddressField устарели в пользу django.db.models.GenericIPAddressField и django.forms.GenericIPAddressField.
Метод BaseMemcachedCache._get_memcache_timeout¶
Метод BaseMemcachedCache._get_memcache_timeout() был переименован в get_backend_timeout(). Несмотря на то, что это частный API, он будет устаревшим.
Варианты сериализации естественных ключей¶
Опции --natural и -n для dumpdata устарели. Вместо этого используйте dumpdata --natural-foreign.
Аналогично, аргумент use_natural_keys для serializers.serialize() устарел. Вместо этого используйте use_natural_foreign_keys.
Объединение аргументов POST и GET в WSGIRequest.REQUEST.¶
Уже настоятельно предлагалось использовать GET и POST вместо REQUEST, поскольку первые более явны. Свойство REQUEST устарело и будет удалено в Django 1.9.
Класс django.utils.datastructures.MergeDict¶
MergeDict существует в первую очередь для поддержки объединения аргументов POST и GET в свойство REQUEST в WSGIRequest. Чтобы объединить словари, используйте вместо этого dict.update(). Класс MergeDict устарел и будет удален в Django 1.9.
Коды языков zh-cn, zh-tw и fy-nl¶
Используемые в настоящее время языковые коды упрощенного китайского «zh-cn», традиционного китайского «zh-tw» и (западного) фризского «fy-nl» устарели и должны быть заменены языковыми кодами «zh-hans», «zh-hant» и «fy» соответственно. Если вы используете эти языковые коды, вам следует переименовать каталоги языковых стандартов и обновить настройки, чтобы отразить эти изменения. Устаревшие коды языков будут удалены в Django 1.9.
Функция django.utils.functional.memoize¶
The function memoize is deprecated and should be replaced by the
functools.lru_cache decorator (available from Python 3.2 onwards).
Django предоставляет резервную копию этого декоратора для более старых версий Python, и она доступна по адресу django.utils.lru_cache.lru_cache. Устаревшая функция будет удалена в Django 1.9.
Географические файлы Sitemap¶
Google прекратил поддержку формата Geo Sitemaps. Следовательно, поддержка Django для Geo Sitemaps устарела и будет удалена в Django 1.8.
Передача вызываемых аргументов в методы набора запросов¶
Вызываемые аргументы для наборов запросов были недокументированной и ненадежной функцией. Он устарел и будет удален в Django 1.9.
Вызываемые аргументы оценивались при создании набора запросов, а не при его оценке, поэтому эта функция не давала никаких преимуществ по сравнению с оценкой аргументов перед их передачей в набор запросов и создавала путаницу из-за того, что аргументы могли быть оценены во время запроса.
Настройка ADMIN_FOR¶
Функция ADMIN_FOR, являющаяся частью административной документации, была удалена. Вы можете удалить этот параметр из конфигурации по своему усмотрению.
SplitDateTimeWidget с DateTimeField¶
Поддержка SplitDateTimeWidget в DateTimeField устарела, вместо этого используйте SplitDateTimeWidget с SplitDateTimeField.
подтвердить¶
Команда управления validate устарела в пользу команды check.
django.core.management.BaseCommand¶
requires_model_validation устарел в пользу нового флага requires_system_checks. Если последний флаг отсутствует, то используется значение первого флага. Определение как requires_system_checks, так и requires_model_validation приводит к ошибке.
Метод check() заменил старый метод validate().
Валидаторы ModelAdmin¶
Атрибуты ModelAdmin.validator_class и default_validator_class устарели в пользу нового атрибутаchecks_class.
Метод ModelAdmin.validate() устарел в пользу метода ModelAdmin.check().
Модуль django.contrib.admin.validation устарел.
django.db.backends.DatabaseValidation.validate_field¶
Этот метод устарел в пользу нового метода check_field. Функциональность, требуемая для check_field(), такая же, как и для validate_field(), но формат вывода отличается. Сторонние базы данных, нуждающиеся в этой функции, должны обеспечивать реализацию check_field().
django.utils.text.javascript_quote¶
javascript_quote() была недокументированной функцией, присутствующей в django.utils.text. Он использовался внутри представления javascript_catalog(), реализация которого была изменена для использования вместо него json.dumps(). Если вы полагались на эту функцию для обеспечения безопасного вывода ненадежных строк, вам следует использовать django.utils.html.escapejs или шаблонный фильтр escapejs. Если все, что вам нужно, это генерировать действительные строки JavaScript, вы можете просто использовать json.dumps().
fix_ampersands использует метод и фильтр шаблонов¶
Метод django.utils.html.fix_ampersands и шаблонный фильтр fix_ampersands устарели, поскольку экранирование амперсандов уже реализовано стандартными функциями экранирования HTML Django. Объединение этого с fix_ampersands приведет либо к двойному экранированию, либо, если вывод считается безопасным, к риску появления XSS-уязвимостей. Наряду с fix_ampersands устарела django.utils.html.clean_html — недокументированная функция, вызывающая fix_ampersands. Поскольку это ускоренное прекращение поддержки, fix_ampersands и clean_html будут удалены в Django 1.8.
Реорганизация настроек тестирования базы данных¶
Все настройки базы данных с префиксом TEST_ устарели в пользу записей в словаре TEST в настройках базы данных. Старые настройки будут поддерживаться до Django 1.9. Для обратной совместимости со старыми версиями Django вы можете определить обе версии настроек, если они совпадают.
Поддержка FastCGI¶
Поддержка FastCGI с помощью команды управления runfcgi будет удалена в Django 1.9. Пожалуйста, разверните свой проект с помощью WSGI.
Перемещены объекты в contrib.sites.¶
После рефакторинга загрузки приложения два объекта в django.contrib.sites.models пришлось переместить, поскольку они должны быть доступны без импорта django.contrib.sites.models, если django.contrib.sites не установлен. Импортируйте RequestSite из django.contrib.sites.requests и get_current_site() из django.contrib.sites.shortcuts. Старые места импорта будут работать до Django 1.9.
django.forms.forms.get_declared_fields()¶
Django больше не использует этот функционал внутри себя. Несмотря на то, что это частный API, он пройдет обычный цикл устаревания.
API поиска частных запросов¶
Частные API django.db.models.sql.where.WhereNode.make_atom() и django.db.models.sql.where.Constraint устарели в пользу нового API пользовательского поиска.
Функции удалены в версии 1.7¶
Эти функции достигли конца цикла устаревания и удалены в Django 1.7. Подробную информацию, в том числе о том, как прекратить использование этих функций, см. в разделе Функции, устаревшие в версии 1.5.
django.utils.simplejsonудален.django.utils.itercompat.productудален.INSTALLED_APPS и TEMPLATE_DIRS больше не преобразуются из простой строки в кортеж.
и
sitemap()больше не принимает аргументmimetypeHttpResponseнемедленно потребляет свое содержимое, если это итератор.Параметр AUTH_PROFILE_MODULE и метод get_profile() в модели User удалены.
Команда управления «очистка» удалена.
Скрипт «daily_cleanup.py» удален.
select_lated()больше не имеет аргумента ключевого словаглубина.Функции
get_warnings_state()/restore_warnings_state()изdjango.test.utilsиsave_warnings_state()/restore_warnings_state()django.test.*TestCase удалены.Метод
check_for_test_cookieвAuthenticationFormудален.Версия
django.contrib.auth.views.password_reset_confirm(), которая поддерживает идентификаторы пользователей в кодировке Base36 (django.contrib.auth.views.password_reset_confirm_uidb36), удалена.Смесь
django.utils.encoding.StrAndUnicodeудалена.