Примечания к выпуску Django 1.5

26 февраля 2013

Добро пожаловать в Django 1.5!

Эти заметки о выпуске охватывают new features, а также некоторые backwards incompatible changes, о которых вы должны знать при переходе с Django 1.4 или более старых версий. Мы также отказались от некоторых функций, которые подробно описаны в our deprecation plan, и мы begun the deprecation process for some features.

Обзор

Самая большая новая возможность в Django 1.5 - это configurable User model. До Django 1.5 приложения, которые хотели использовать аутентификационную структуру Django (django.contrib.auth), были вынуждены использовать определение «пользователя», данное в Django. Теперь в Django 1.5 вы можете заменить модель User на ту, которую вы напишете сами. Это может быть простое расширение существующей модели User - например, вы можете добавить поле ID Twitter или Facebook - или вы можете полностью заменить User на модель, полностью адаптированную для вашего сайта.

Django 1.5 также является первым релизом с поддержкой Python 3 support! Мы называем эту поддержку «экспериментальной», потому что пока не считаем ее готовой к производству, но все готово для того, чтобы вы начали переносить свои приложения на Python 3. Наш следующий релиз, Django 1.6, будет поддерживать Python 3 безоговорочно.

Другие заметные новые возможности в Django 1.5 включают:

  • Support for saving a subset of model’s fields - Model.save() теперь принимают аргумент update_fields, позволяющий указать, какие поля записываются обратно в базу данных при вызове save(). Это может помочь при выполнении высококонкурентных операций и повысить производительность.
  • Лучше support for streaming responses через новый класс ответа StreamingHttpResponse.
  • GeoDjango теперь поддерживает PostGIS 2.0.
  • … и многое другое; see below.

Там, где это возможно, мы стараемся внедрять новые возможности с обратной совместимостью согласно our API stability policy. Однако, как и в предыдущих релизах, Django 1.5 поставляется с некоторыми незначительными backwards incompatible changes; людям, переходящим с предыдущих версий Django, следует внимательно ознакомиться с этим списком.

Стоит отметить одну устаревшую функцию - переход на тег url в «новом стиле». До версии Django 1.3 синтаксис типа {% url myview %} интерпретировался неправильно (Django считал "myview" буквальным именем представления, а не переменной шаблона с именем myview). В Django 1.3 и выше появился синтаксис {% load url from future %}, чтобы привести к правильному поведению, когда myview рассматривается как переменная.

В итоге, если вы не используете {% load url from future %} в своих шаблонах, вам нужно будет изменить теги типа {% url myview %} на {% url "myview" %}. Если вы *используете {% load url from future %}, вы можете просто удалить эту строку в Django 1.5

Совместимость с Python

Django 1.5 требует Python 2.6.5 или выше, хотя мы настоятельно рекомендуем Python 2.7.3 или выше. Поддержка Python 2.5 и ниже была прекращена.

Это изменение должно затронуть лишь небольшое количество пользователей Django, поскольку большинство производителей операционных систем сегодня поставляют Python 2.6 или более новую версию по умолчанию. Однако, если вы все еще используете Python 2.5, вам придется придерживаться Django 1.4 до тех пор, пока вы не сможете обновить свою версию Python. Согласно our support policy, Django 1.4 будет продолжать получать поддержку безопасности до выхода Django 1.6.

Django 1.5 не работает на финальном релизе Jython, потому что последний релиз Jython в настоящее время не поддерживает Python 2.6. Однако Jython в настоящее время предлагает альфа-релиз с поддержкой 2.7, и Django 1.5 поддерживает этот альфа-релиз.

Поддержка Python 3

В Django 1.5 появилась поддержка Python 3 - в частности, Python 3.2 и выше. Это поставляется в виде единой кодовой базы; вам не нужно устанавливать другую версию Django на Python 3. Это означает, что вы можете писать приложения, предназначенные только для Python 2, только для Python 3, или отдельные приложения, поддерживающие обе платформы.

Однако пока мы называем эту поддержку «экспериментальной»: хотя она прошла обширное тестирование с помощью нашего автоматизированного набора тестов, она получила очень мало реальных испытаний. Мы сделали все возможное, чтобы устранить ошибки, но мы не можем быть уверены, что охватили все возможные варианты использования Django.

Некоторые функции Django недоступны, потому что они зависят от стороннего программного обеспечения, которое еще не перенесено на Python 3, в том числе:

  • бэкенд базы данных MySQL (зависит от MySQLdb)
  • ImageField (зависит от PIL)
  • LiveServerTestCase (зависит от Selenium WebDriver)

Кроме того, Django - это не просто веб-фреймворк, это экосистема подключаемых компонентов. На данный момент очень мало сторонних приложений было перенесено на Python 3, поэтому маловероятно, что реальное приложение будет иметь все свои зависимости под Python 3.

Таким образом, мы рекомендуем не использовать Django 1.5 в производстве под Python 3. Вместо этого используйте эту возможность, чтобы начать перенос приложений на Python 3. Если вы являетесь автором подключаемого компонента, мы призываем вас начать перенос уже сейчас.

Мы планируем предложить первоклассную, готовую к производству поддержку Python 3 в нашем следующем релизе Django 1.6.

Что нового в Django 1.5

Настраиваемая модель пользователя

В Django 1.5 вы теперь можете использовать свою собственную модель в качестве хранилища данных, связанных с пользователями. Если вашему проекту нужно имя пользователя с более чем 30 символами, или если вы хотите хранить имена пользователей в формате, отличном от имени/фамилии, или если вы хотите поместить пользовательскую информацию о профиле в ваш объект User, теперь вы можете это сделать.

Если у вас есть стороннее приложение многократного использования, которое ссылается на модель User, вам может потребоваться внести некоторые изменения в то, как вы ссылаетесь на экземпляры User. Вам также следует задокументировать все специфические особенности модели User, на которые опирается ваше приложение.

Более подробную информацию см. в documentation on custom user models.

Поддержка сохранения подмножества полей модели

В методе Model.save() появился новый ключевой аргумент update_fields. С помощью этого аргумента можно сохранить только выборочный список полей модели. Это может быть полезно для повышения производительности или для того, чтобы избежать перезаписи одновременных изменений.

Отложенные экземпляры (загруженные по .only() или .defer()) будут автоматически сохранять только загруженные поля. Если какое-либо поле было установлено вручную после загрузки, оно также будет обновлено при сохранении.

Более подробную информацию см. в документации Model.save().

Явная поддержка потоковых ответов

До версии Django 1.5 можно было создать потоковый ответ, передав итератор в HttpResponse. Но это было ненадежно: любое промежуточное ПО, которое обращалось к атрибуту content, преждевременно расходовало итератор.

Теперь вы можете явно генерировать потоковый ответ с помощью нового класса StreamingHttpResponse. Этот класс раскрывает атрибут streaming_content, который является итератором.

Поскольку StreamingHttpResponse не имеет атрибута content, промежуточное ПО, которому нужен доступ к содержимому ответа, должно проверить наличие потоковых ответов и вести себя соответствующим образом.

{% verbatim %} тег шаблона

Чтобы облегчить работу с шаблонами JavaScript, которые сталкиваются с синтаксисом Django, теперь вы можете использовать блочный тег verbatim, чтобы избежать разбора содержимого тега.

Извлечение ContentType экземпляров, связанных с прокси-моделями

Методы ContentTypeManager.get_for_model() и ContentTypeManager.get_for_models() имеют новый аргумент ключевое слово - соответственно for_concrete_model и for_concrete_models. Передавая False с помощью этого аргумента, теперь можно получить ContentType, связанные с прокси-моделями.

Новая переменная view в контексте представлений на основе классов

Во всех generic class-based views (или любом представлении, основанном на классе и наследующем от ContextMixin) контекстный словарь содержит переменную view, которая указывает на экземпляр View.

GeoDjango

  • <<< Объекты LineString и MultiLineString GEOS теперь поддерживают методы interpolate() и project() (так называемая линейная привязка).
  • Свойства wkb и hex объектов GEOSGeometry сохраняют размерность Z.
  • Была добавлена поддержка PostGIS 2.0 и прекращена поддержка GDAL < 1.5.

Новые учебники

Дополнения к документации включают обновленный Tutorial 3 и новый tutorial on testing. Новый раздел «Продвинутые учебники» предлагает How to write reusable apps, а также пошаговое руководство для новых участников Writing your first patch for Django.

Незначительные особенности

Django 1.5 также включает несколько более мелких улучшений, на которые стоит обратить внимание:

  • Теперь шаблонизатор интерпретирует True, False и None как соответствующие объекты Python.

  • django.utils.timezone предоставляет помощника для преобразования известных дат между часовыми поясами. См. localtime().

  • Общие представления поддерживают запросы OPTIONS.

  • Команды управления больше не вызывают SystemExit при вызове кодом из call_command(). Любое исключение, вызванное командой (в основном CommandError), распространяется.

    Более того, при выводе ошибок или сообщений в пользовательских командах теперь следует использовать self.stdout.write('message') и self.stderr.write('error') (см. примечание о management commands output).

  • Команда управления dumpdata выводит по одной строке за раз, предотвращая ошибки выхода за пределы памяти при сбросе больших наборов данных.

  • В местном колорите Канады к допустимым кодам для Квебека был добавлен «pq». Это старая аббревиатура.

  • Декоратор receiver теперь может подключаться к более чем одному сигналу, предоставляя список сигналов.

  • В админке теперь можно фильтровать пользователей по группам, в которых они состоят.

  • QuerySet.bulk_create() теперь имеет аргумент batch_size. По умолчанию размер партии неограничен, за исключением SQLite, где размер одной партии ограничен, чтобы не превысить 999 параметров на запрос.

  • Настройки LOGIN_URL и LOGIN_REDIRECT_URL теперь также принимают имена функций представления и named URL patterns. Это позволяет сократить дублирование конфигурации. Более подробную информацию можно найти в документации login_required().

  • Django теперь предоставляет mod_wsgi auth handler.

  • QuerySet.delete() и Model.delete() теперь могут принимать быстрый путь в некоторых случаях. Быстрый путь позволяет использовать меньше запросов и меньше объектов, загружаемых в память. Подробности смотрите в QuerySet.delete().

  • Экземпляр ResolverMatch хранится в запросе как resolver_match.

  • По умолчанию все сообщения журнала, достигающие регистратора django, когда DEBUG становится True, отправляются на консоль (если вы не переопределите регистратор в настройках LOGGING).

  • При использовании RequestContext теперь можно искать разрешения с помощью {% if 'someapp.someperm' in perms %} в шаблонах.

  • Больше не требуется иметь шаблоны 404.html и 500.html в корневом каталоге шаблонов. Django будет выводить некоторые базовые сообщения об ошибках для обеих ситуаций, когда эти шаблоны не найдены. Тем не менее, рекомендуется в качестве хорошей практики предоставлять эти шаблоны для того, чтобы представить пользователю красивые страницы ошибок.

  • django.contrib.auth предоставляет новый сигнал, который выдается всякий раз, когда пользователь не может успешно войти в систему. См. user_login_failed

  • Новая опция loaddata --ignorenonexistent игнорирует данные для полей, которые больше не существуют.

  • Новые утверждения assertXMLEqual() и assertXMLNotEqual() позволяют проверять равенство для содержимого XML на семантическом уровне, не обращая внимания на синтаксические различия (пробелы, порядок атрибутов и т.д.).

  • RemoteUserMiddleware теперь заставляет выйти из системы, когда заголовок REMOTE_USER исчезает во время одной и той же сессии браузера.

  • cache-based session backend может хранить данные сессии в кэше не по умолчанию.

  • Теперь на моделях можно создавать многоколоночные индексы. Для получения дополнительной информации ознакомьтесь с документацией index_together.

  • В конфигурации логирования Django включена функция verbose Deprecation warnings, и предупреждения записываются в систему логирования. Зафиксированные предупреждения направляются через обработчик логирования console, который по умолчанию требует, чтобы DEBUG был равен True для вывода. В результате DeprecationWarnings должны выводиться на консоль в средах разработки так, как они выводились в Python версий < 2.7.

  • API для метода django.contrib.admin.ModelAdmin.message_user() был модифицирован, чтобы принимать дополнительные аргументы, добавляя возможности, аналогичные django.contrib.messages.add_message(). Это полезно для генерации сообщений об ошибках при выполнении действий администратора.

  • Фильтры списка администратора теперь могут быть настроены на каждый запрос благодаря новому методу django.contrib.admin.ModelAdmin.get_list_filter().

Изменения в 1.5, несовместимые с обратными изменениями

Предупреждение

В дополнение к изменениям, описанным в этом разделе, обязательно просмотрите deprecation plan для любых функций, которые были удалены. Если вы не обновили свой код в течение срока устаревания данной функции, ее удаление может выглядеть как изменение, несовместимое с обратным развитием событий.

ALLOWED_HOSTS требуется в производстве

Новая настройка ALLOWED_HOSTS проверяет заголовок запроса Host и защищает от атак с отравлением хоста. Эта настройка теперь требуется всякий раз, когда DEBUG является False, иначе django.http.HttpRequest.get_host() вызовет SuspiciousOperation. Подробнее о новой настройке см. в full documentation.

Менеджеры по абстрактным моделям

Абстрактные модели могут определять пользовательский менеджер, и этот менеджер will be inherited by any concrete models extending the abstract model. Однако, если вы попытаетесь использовать абстрактную модель для вызова метода менеджера, то теперь будет вызвано исключение. Ранее вызов был разрешен, но при попытке выполнить любую операцию с базой данных (обычно с ошибкой «таблица не существует» от базы данных) вызов был бы неудачным.

Если у вас есть функциональность на менеджере, которую вы вызывали с помощью абстрактного класса, вам следует перенести эту логику в Python staticmethod или classmethod на абстрактный класс.

Контекст в годовом архиве на основе классных представлений

Для согласованности с другими общими представлениями, основанными на дате, YearArchiveView теперь передает year в контексте как datetime.date, а не как строку. Если вы используете {{ year }} в своих шаблонах, вы должны заменить его на {{ year|date:"Y" }}.

next_year и previous_year также были добавлены в контекст. Они вычисляются в соответствии с allow_empty и allow_future.

Контекст в архиве года и месяца на основе классных представлений

YearArchiveView и MonthArchiveView были документированы для предоставления date_list, отсортированного в порядке возрастания в контексте, как и их предшественники на основе функций, но на самом деле он был в порядке убывания. В версии 1.5 документированный порядок был восстановлен. Вы можете добавить (или убрать) ключевое слово reversed, когда вы итерируете date_list в шаблоне:

{% for date in date_list reversed %}

ArchiveIndexView по-прежнему обеспечивает date_list в порядке убывания.

Контекст в TemplateView

Для согласованности с дизайном других общих представлений TemplateView больше не передает словарь params в контекст, а передает переменные из URLconf непосредственно в контекст.

Неформализованные данные в HTTP-запросах

request.POST больше не будет включать в заголовок данные, размещенные через HTTP-запросы с неспецифическими для формы типами содержимого. В предыдущих версиях данные, отправленные с типами содержимого, отличными от multipart/form-data или application/x-www-form-urlencoded, по-прежнему были представлены в атрибуте request.POST. Разработчики, желающие получить доступ к необработанным данным POST в таких случаях, должны использовать атрибут request.body.

request_finished сигнал

Раньше Django посылал сигнал request_finished, как только функция представления возвращала ответ. Это плохо взаимодействовало с streaming responses, которые задерживали генерацию контента.

Теперь этот сигнал отправляется после того, как содержимое полностью потреблено шлюзом WSGI. Это может быть обратно несовместимо, если вы полагаетесь на то, что сигнал будет отправлен до отправки содержимого ответа клиенту. В этом случае вместо него следует использовать middleware.

Примечание

Некоторые серверы WSGI и промежуточное ПО не всегда вызывают close на объекте ответа после обработки запроса, в частности, uWSGI до версии 1.2.6 и промежуточное ПО Sentry для сообщений об ошибках до версии 2.0.7. В этих случаях сигнал request_finished вообще не посылается. Это может привести к простаиванию соединений с серверами баз данных и memcache.

OPTIONS, PUT и DELETE запросы в тестовом клиенте

В отличие от GET и POST, эти методы HTTP не реализуются веб-браузерами. Скорее, они используются в API, которые передают данные в различных форматах, таких как JSON или XML. Поскольку такие запросы могут содержать произвольные данные, Django не пытается декодировать их тело.

Однако тестовый клиент использовал для запросов OPTIONS и DELETE строку запроса, как для GET, а для запросов PUT - тело запроса, как для POST. Такая кодировка была произвольной и не соответствовала поведению Django при получении запросов, поэтому в Django 1.5 она была удалена.

Если вы использовали параметр data в запросе OPTIONS или DELETE, вы должны преобразовать его в строку запроса и добавить к параметру path.

Если вы использовали параметр data в запросе PUT без аргумента content_type, вы должны закодировать свои данные перед передачей их тестовому клиенту и установить аргумент content_type.

Системная версия simplejson больше не используется

As explained below, Django 1.5 устаревает django.utils.simplejson в пользу встроенного в Python 2.6 модуля json. Теоретически, это изменение безвредно. К сожалению, из-за несовместимости версий simplejson, в некоторых обстоятельствах оно может вызвать ошибки.

Функции, связанные с JSON, в Django 1.4 всегда использовали django.utils.simplejson. Этот модуль был на самом деле:

  • Системная версия simplejson, если она была доступна (т.е. import simplejson работает), если она была более свежей, чем встроенная копия Django, или имела ускорения C, или
  • Модуль json из стандартной библиотеки, если он доступен (т.е. Python 2.6 или выше), или
  • Встроенная копия версии 2.0.7 программы simplejson.

В Django 1.5 эти функции используют модуль Python json, который основан на версии 2.0.9 модуля simplejson.

Нет никаких известных несовместимостей между копией Django версии 2.0.7 и копией Python версии 2.0.9. Однако существуют некоторые несовместимости между другими версиями simplejson:

  • Хотя API simplejson документирован как всегда возвращающий строки Unicode, дополнительная реализация на языке C может возвращать байтовые строки. Это было исправлено в Python 2.7.
  • simplejson.JSONEncoder получил аргумент в виде ключевого слова namedtuple_as_object в версии 2.2.

Более подробную информацию об этих несовместимостях можно найти в ticket #18023.

В итоге, если вы установили simplejson и ваш код использует внутренние компоненты сериализации Django напрямую - например, django.core.serializers.json.DjangoJSONEncoder, то переход с simplejson на json может сломать ваш код. (Как правило, изменения внутренних механизмов не документируются; здесь мы делаем исключение).

На данный момент сопровождающие Django считают, что использование json из стандартной библиотеки дает самую сильную гарантию обратной совместимости. Они рекомендуют использовать его впредь.

Строковые типы параметров метода хешера

Если вы написали custom password hasher, ваши методы encode(), verify() или safe_summary() должны принимать параметры Unicode (password, salt или encoded). Если какой-либо из методов хэширования требует байтовых строк, вы можете использовать утилиту force_bytes() для кодирования строк.

Проверка номера предыдущей_страницы и номера следующей_страницы

При использовании object pagination методы previous_page_number() и next_page_number() объекта Page не проверяли, находится ли возвращаемое число внутри существующего диапазона страниц. Теперь они проверяют это и вызывают исключение InvalidPage, если число слишком мало или слишком велико.

Изменено поведение опции автокоммита базы данных в PostgreSQL

Опция автокоммита в PostgreSQL не работала так, как рекламировалось ранее. Она работала для одного блока транзакции, но после выхода первого блока поведение автокоммита не восстанавливалось. Теперь эта ошибка исправлена в версии 1.5. Хотя это всего лишь исправление, стоит проверить поведение ваших приложений, если вы используете PostgreSQL вместе с опцией autocommit.

Сессия не сохраняется при 500 ответах

Django’s session middleware пропустит сохранение данных сессии, если код состояния ответа равен 500.

Проверка электронной почты при неудачном входе в систему администратора

До версии Django 1.5, если вы пытались войти в интерфейс администратора и по ошибке использовали свой адрес электронной почты вместо имени пользователя, интерфейс администратора выдавал предупреждение о том, что ваш адрес электронной почты не является вашим именем пользователя. В Django 1.5 введение custom user models потребовало удаления этого предупреждения. Это не меняет поведение входа на сайт администратора; это только влияет на предупреждение, которое отображается при одном конкретном способе отказа входа.

Изменения в выполнении тестов

В выполнение тестов были внесены некоторые изменения, которые могут быть обратно несовместимы для некоторых тестовых установок:

Промывка базы данных в django.test.TransactionTestCase

Ранее база данных тестов усекалась перед каждым запуском теста в виде TransactionTestCase.

Чтобы иметь возможность запускать модульные тесты в любом порядке и быть уверенным, что они всегда изолированы друг от друга, TransactionTestCase теперь будет сбрасывать базу данных после каждого запуска теста.

Больше нет неявного сброса последовательностей БД

TransactionTestCase тесты, используемые для автоматического сброса последовательностей первичных ключей вместе с действиями по очистке базы данных, описанными выше.

Это было изменено, чтобы последовательности не сбрасывались неявно. Это может привести к поломке тестов TransactionTestCase, которые зависят от жестко закодированных значений первичного ключа.

Новый атрибут reset_sequences может быть использован для принуждения старого поведения для TransactionTestCase, которые могут в этом нуждаться.

Заказ тестов

Чтобы убедиться, что весь код TestCase начинается с чистой базы данных, тесты теперь выполняются в следующем порядке:

  • Во-первых, все модульные тесты (включая unittest.TestCase, SimpleTestCase, TestCase и TransactionTestCase) выполняются без какого-либо гарантированного или принудительного упорядочивания между ними.
  • Затем запускаются любые другие тесты (например, doctests), которые могут изменить базу данных без восстановления ее исходного состояния.

Это не должно вызвать никаких проблем, если только у вас нет существующих доктестов, которые предполагают, что ранее выполненный TransactionTestCase оставил некоторое состояние базы данных, или модульных тестов, которые полагаются на сохранение некоторой формы состояния после выполнения других тестов. Такие тесты уже очень хрупкие, и теперь они должны быть изменены, чтобы иметь возможность работать независимо.

cleaned_data словарь сохраняется для недействительных форм

Словарь cleaned_data теперь всегда присутствует после валидации формы. Когда форма не проходит валидацию, он содержит только те поля, которые прошли валидацию. Вы должны проверять успешность валидации методом is_valid(), а не наличием или отсутствием атрибута cleaned_data на форме.

Поведение syncdb с несколькими базами данных

syncdb теперь запрашивает маршрутизаторы базы данных, чтобы определить, должны ли типы содержимого (когда включена опция contenttypes) и разрешения (когда включена опция auth) быть созданы в целевой базе данных. Ранее они создавались в базе данных по умолчанию, даже если с помощью опции --database была указана другая база данных.

Если вы используете syncdb на нескольких базах данных, вы должны убедиться, что ваши маршрутизаторы позволяют синхронизировать типы содержимого и разрешения только на одной из них. Более подробную информацию смотрите в документации по behavior of contrib apps with multiple databases.

Десериализатор XML не будет разбирать документы с DTD

Для предотвращения атак типа «отказ в обслуживании», связанных с внешними ссылками на сущности и расширением сущностей, десериализатор модели XML теперь отказывается анализировать XML документы, содержащие DTD (определение DOCTYPE). Поскольку XML сериализатор не выводит DTD, это не повлияет на обычное использование, только на случаи, когда созданные пользователем XML документы передаются десериализатору модели Django.

Наборы форм по умолчанию max_num

Значение None (по умолчанию) для аргумента max_num фабрики форм больше не разрешает по умолчанию любое количество форм в наборе форм. Вместо этого, для предотвращения атак на исчерпание памяти, теперь по умолчанию устанавливается ограничение в 1000 форм. Это ограничение можно повысить, явно задав большее значение для max_num.

Разное

  • django.forms.ModelMultipleChoiceField теперь возвращает пустое значение QuerySet вместо пустого списка.
  • int_to_base36() правильно выдает TypeError вместо ValueError для нецелых входов.
  • Шаблонный фильтр slugify теперь доступен как стандартная функция Python по адресу django.utils.text.slugify(). Аналогично, remove_tags доступен по адресу django.utils.html.remove_tags().
  • Загруженные файлы больше не создаются как исполняемые по умолчанию. Если вам нужно, чтобы они были исполняемыми, измените значение FILE_UPLOAD_PERMISSIONS в соответствии с вашими потребностями. Новое значение по умолчанию - 0o666 (восьмеричное), а текущее значение umask сначала маскируется.
  • F expressions поддерживал побитовые операторы & и |. Теперь эти операторы доступны с помощью .bitand() и .bitor() вместо них. Удаление & и | было сделано для согласованности с объединением Q() expressions и QuerySet, где эти операторы используются как булевы операторы AND и OR.
  • В вызове filter(), когда F expressions содержал поиск, охватывающий многозначные отношения, он не всегда повторно использовал те же отношения, что и другие поиски по той же цепочке. Это было изменено, и теперь выражения F() всегда будут использовать те же отношения, что и другие поиски в пределах одного вызова filter().
  • Тег шаблона csrf_token больше не заключен в div. Если вам нужна проверка HTML на соответствие DTD до HTML5 Strict, вы должны добавить div вокруг него на своих страницах.
  • Библиотека тегов шаблонов adminmedia, которая содержала только устаревший тег шаблона {% admin_media_prefix %}, была удалена. Попытка загрузить ее с помощью {% load adminmedia %} будет неудачной. Если ваши шаблоны все еще содержат эту строку, вы должны удалить ее.
  • Из-за ошибки в реализации можно было использовать django.contrib.redirects без включения django.contrib.sites. Теперь это больше не допускается. Если вы используете django.contrib.redirects, убедитесь, что INSTALLED_APPS содержит django.contrib.sites.
  • BoundField.label_tag теперь экранирует свой аргумент contents. Чтобы избежать экранирования HTML, используйте django.utils.safestring.mark_safe() для аргумента перед его передачей.
  • Доступ к обратным отношениям один-к-одному, полученным через select_related(), теперь вызывает DoesNotExist вместо возврата None.

Функции, устаревшие в версии 1.5

django.contrib.localflavor

Приложение localflavor contrib было разделено на отдельные пакеты. Сам django.contrib.localflavor будет удален в Django 1.6, после ускоренной депривации.

Новые пакеты доступны на GitHub. Основная команда не может эффективно поддерживать эти пакеты в долгосрочной перспективе - на данный момент она охватывает всего десяток стран; как и в случае с переводами, поддержка будет передана заинтересованным членам сообщества.

django.contrib.markup

Модуль markup contrib был устаревшим и будет следовать ускоренному графику устаревания. Прямое использование библиотек разметки Python или сторонних библиотек тегов предпочтительнее, чем Django, поддерживающий эту функциональность во фреймворке.

AUTH_PROFILE_MODULE

С введением custom user models больше нет необходимости во встроенном механизме для хранения данных профиля пользователя.

Вы по-прежнему можете определять модели профилей пользователей, которые имеют связь один-к-одному с моделью User - на самом деле, для многих приложений, которым необходимо связать данные с учетной записью User, это будет подходящим шаблоном проектирования. Однако параметр AUTH_PROFILE_MODULE и метод django.contrib.auth.models.User.get_profile() для доступа к модели профиля пользователя больше не должны использоваться.

Потоковое поведение HttpResponse

В Django 1.5 устарела возможность потоковой передачи ответа путем передачи итератора в HttpResponse. Если вы полагаетесь на это поведение, переключитесь на StreamingHttpResponse. См. Явная поддержка потоковых ответов выше.

В Django 1.7 и выше итератор будет немедленно поглощен HttpResponse.

django.utils.simplejson

Поскольку Django 1.5 отказывается от поддержки Python 2.5, мы теперь можем полагаться на наличие модуля json в стандартной библиотеке Python, поэтому мы удалили нашу собственную копию simplejson. Теперь вам следует импортировать json вместо django.utils.simplejson.

К сожалению, это изменение может иметь нежелательные побочные эффекты из-за несовместимости версий simplejson - см. раздел backwards-incompatible changes. Если вы полагаетесь на возможности, добавленные в simplejson после того, как он стал json Python, вам следует явно импортировать simplejson.

django.utils.encoding.StrAndUnicode

Микс-ин django.utils.encoding.StrAndUnicode был устаревшим. Определите метод __str__ и вместо него примените декоратор django.utils.encoding.python_2_unicode_compatible.

django.utils.itercompat.product

Функция django.utils.itercompat.product была устаревшей. Вместо нее используйте встроенную itertools.product().

cleanup команда управления

Команда управления cleanup была устаревшей и заменена на clearsessions.

daily_cleanup.py сценарий

Недокументированный сценарий daily_cleanup.py был устаревшим. Вместо него используйте команду управления clearsessions.

Вернуться на верх