Примечания к выпуску Django версии 0.96¶
Добро пожаловать в Django 0.96!
Основной целью 0.96 является очистка и стабилизация функций, представленных в 0.95. С 0.95 было сделано несколько небольших backwards-incompatible changes, но процесс обновления должен быть достаточно простым и не требовать серьезных изменений в существующих приложениях.
Однако мы также выпускаем 0.96 сейчас, потому что на ближайшее время запланирован ряд изменений, несовместимых с обратным развитием. После завершения они повлекут за собой некоторые изменения кода для разработчиков приложений, поэтому мы рекомендуем вам придерживаться Django 0.96 до следующего официального релиза; тогда вы сможете обновиться одним шагом, а не вносить постепенные изменения, чтобы идти в ногу с версией разработки Django.
Обратно-несовместимые изменения¶
Следующие изменения могут потребовать от вас обновления кода при переходе с 0.95 на 0.96:
MySQLdb
требование к версии¶
Из-за ошибки в старых версиях модуля MySQLdb
Python (который Django использует для подключения к базам данных MySQL), бэкенд MySQL в Django теперь требует версию 1.2.1p2 или выше MySQLdb
, и будет вызывать исключения, если вы попытаетесь использовать более старую версию.
Если вы не можете обновить свою копию MySQLdb
до соответствия этому требованию, в Django был добавлен отдельный, обратно совместимый бэкенд под названием «mysql_old». Чтобы использовать этот бэкенд, измените параметр DATABASE_ENGINE
в вашем файле настроек Django следующим образом:
DATABASE_ENGINE = "mysql"
к этому:
DATABASE_ENGINE = "mysql_old"
Однако мы настоятельно рекомендуем пользователям MySQL перейти на более свежую версию MySQLdb
как можно скорее. Бэкенд «mysql_old» предоставляется только для облегчения этого перехода и считается устаревшим; кроме необходимых исправлений безопасности, он не будет активно поддерживаться и будет удален в будущем выпуске Django.
Также обратите внимание, что некоторые возможности, например, новая настройка DATABASE_OPTIONS
(подробнее см. databases documentation), доступны только для бэкенда «mysql» и не будут доступны для «mysql_old».
Изменены имена ограничений базы данных¶
Формат имен ограничений, которые Django генерирует для ссылок на внешние ключи, немного изменился. Эти имена обычно используются только в тех случаях, когда невозможно поместить ссылку непосредственно на затронутый столбец, поэтому они не всегда видны.
Эффект этого изменения заключается в том, что выполнение manage.py reset
и аналогичных команд в существующей базе данных может привести к созданию SQL с новой формой имени ограничения, в то время как сама база данных содержит ограничения, названные в старой форме; это приведет к тому, что сервер базы данных выдаст сообщение об ошибке, связанной с изменением несуществующих ограничений.
Если вам необходимо обойти эту проблему, есть два метода:
- Перенаправьте вывод
manage.py
в файл и отредактируйте сгенерированный SQL, чтобы использовать правильные имена ограничений перед его выполнением. - Изучите вывод
manage.py sqlall
, чтобы увидеть имена ограничений нового стиля, и используйте его как руководство для переименования существующих ограничений в вашей базе данных.
Изменение имени в manage.py
¶
Несколько опций для manage.py
изменились с добавлением поддержки приспособлений:
- Появились новые команды
dumpdata
иloaddata
, которые, как и следовало ожидать, будут сбрасывать и загружать данные в/из базы данных. Эти команды могут работать с любым из поддерживаемых Django форматов сериализации. - Команда
sqlinitialdata
была переименована вsqlcustom
, чтобы подчеркнуть, чтоloaddata
следует использовать для данных (иsqlcustom
для других пользовательских SQL - представлений, хранимых процедур и т.д.). - Убрана устаревшая команда
install
. Используйтеsyncdb
.
Изменена экранировка обратной косой черты¶
API базы данных Django теперь экранирует обратные слеши, передаваемые в качестве параметров запроса. Если у вас есть код API базы данных, который сопоставляет обратные слэши, и он работал раньше (несмотря на отсутствие экранирования), вам придется изменить свой код, чтобы «убрать» слэши на один уровень.
Например, раньше это работало так:
# Find text containing a single backslash
MyModel.objects.filter(text__contains='\\\\')
Вышеприведенное утверждение неверно и должно быть переписано следующим образом:
# Find text containing a single backslash
MyModel.objects.filter(text__contains='\\')
Что нового в 0.96?¶
Эта ревизия представляет собой более тысячи исходных коммитов и более четырехсот исправлений ошибок, поэтому мы не можем каталогизировать все изменения. Здесь мы описываем наиболее заметные изменения в этом выпуске.
Новая библиотека форм¶
django.newforms
- это новая библиотека Django для работы с формами. Она заменяет django.forms
, старый фреймворк форм/манипулятора/оценки. Оба API доступны в 0.96, но в течение следующих двух релизов мы планируем полностью перейти на новую систему форм, а старую систему деприватизировать и удалить.
В этом переходе есть три элемента:
Мы скопировали текущее значение
django.forms
вdjango.oldforms
. Это позволит вам обновить ваш код сейчас, а не ждать изменений, несовместимых с обратным ходом, и не спешить исправлять свой код после этого. Просто измените свои операторы импорта следующим образом:from django import forms # 0.95-style from django import oldforms as forms # 0.96-style
В следующем официальном выпуске Django текущая версия
django.newforms
будет переведена наdjango.forms
. Это будет обратно несовместимое изменение, и всем, кто все еще использует старую версиюdjango.forms
к тому времени, нужно будет изменить свои операторы импорта, как описано выше.В следующем релизе после этого будет полностью удалено
django.oldforms
.
Хотя библиотека newforms
будет продолжать развиваться, она уже готова к использованию для большинства распространенных случаев. Мы рекомендуем всем, кто только начинает работать с формами, отказаться от старой системы форм и начать с новой.
Для получения дополнительной информации о django.newforms
, прочитайте newforms documentation.
Улучшения в URLconf¶
Теперь вы можете использовать любую вызываемую переменную в качестве обратного вызова в URLconfs (ранее разрешалось использовать только строки, ссылающиеся на вызываемые переменные). Это позволяет использовать URLconfs гораздо более естественно. Например, этот URLconf:
from django.conf.urls.defaults import *
urlpatterns = patterns('',
('^myview/$', 'mysite.myapp.views.myview')
)
теперь может быть переписана как:
from django.conf.urls.defaults import *
from mysite.myapp.views import myview
urlpatterns = patterns('',
('^myview/$', myview)
)
Одно из полезных применений этого можно увидеть при использовании декораторов; это изменение позволяет вам применять декораторы к представлениям в вашей URLconf. Таким образом, вы можете сделать общее представление, требующее входа в систему, очень просто:
from django.conf.urls.defaults import *
from django.contrib.auth.decorators import login_required
from django.views.generic.list_detail import object_list
from mysite.myapp.models import MyModel
info = {
"queryset" : MyModel.objects.all(),
}
urlpatterns = patterns('',
('^myview/$', login_required(object_list), info)
)
Обратите внимание, что оба синтаксиса (строки и callables) действительны и останутся действительными в обозримом будущем.
Система тестирования¶
Django теперь включает фреймворк для тестирования, так что вы можете начать трансформировать страх в скуку (с извинениями Кенту Беку). Вы можете писать тесты на основе doctest
или unittest
и тестировать ваши представления с помощью простого тестового клиента.
Также появилась поддержка «фикстур» - начальных данных, хранящихся в любом из поддерживаемых serialization formats, которые будут загружены в вашу базу данных в начале тестирования. Это значительно упрощает тестирование с реальными данными.
Подробную информацию см. в разделе the testing documentation.
Улучшения в интерфейсе администратора¶
Небольшое, но очень приятное изменение: в интерфейс администратора были добавлены специальные представления для добавления и обновления пользователей, поэтому вам больше не нужно беспокоиться о работе с хэшированными паролями в админке.
Спасибо¶
Начиная с версии 0.95, несколько человек сделали шаг вперед и взяли на себя новую важную роль в развитии Django. Мы хотели бы поблагодарить этих людей за всю их тяжелую работу:
- Расселу Кит-Мейджи и Малкольму Трединнику за их большой вклад в код. Без них этот выпуск был бы невозможен.
- Наш новый менеджер релизов, Джеймс Беннетт, за его работу по выпуску 0.95.1, 0.96 и (надеюсь) будущих релизов.
- Нашим билетным менеджерам Крису Бивену (он же SmileyChris), Саймону Гринхиллу, Майклу Радзиею и Гари Уилсону. Они согласились взять на себя монументальную задачу по объединению наших тикетов в хорошо каталогизированное представление. Выяснить, над чем работать, теперь стало в миллион раз проще; еще раз спасибо, ребята.
- Каждый, кто прислал сообщение об ошибке, патч или комментарий к билету. Мы не можем поблагодарить всех поименно - более 200 разработчиков прислали исправления, которые вошли в 0.96 - но все, кто внес свой вклад в Django, перечислены в списке AUTHORS.