欢迎来到 Django 0.96 版本!
Django 0.96 版本的主要目标是清理和稳定由 0.95 版本引入的特性。自从 0.95 过后,有很多小的 向后兼容变化,但升级过程应该足够简单,且针对已有的应用不应该需要重大的更改。
不过,我们现在发布 0.96 版本也是因为我们计划在不久的将来进行一系列向后不兼容的改动。一旦完成,它们将涉及到应用程序开发人员的一些代码变化,所以我们建议你坚持使用 Django 0.96,直到下一个正式发布;然后你就可以一步到位地升级,而不是需要做增量的变化来跟上 Django 的开发版本。
当你从 0.95 切换到 0.96 时,以下更改可能需要你更新代码:
MySQLdb
版本需求¶由于 MySQLdb
Python 模块(Django 用来连接 MySQL 数据库)旧版本的一个漏洞,Django 的 MySQL 后端现在需要 1.2.1p2 或更高版本的 MySQLdb
,如果你试图使用旧版本,会引发异常。
如果你目前无法升级你的 MySQLdb
来满足这个要求,一个单独的,向后兼容的后端,叫做 “mysql_old”,已经被添加到 Django 中。要使用这个后端,将 Django 配置文件中的 DATABASE_ENGINE
配置从这个:
DATABASE_ENGINE = "mysql"
改成这个:
DATABASE_ENGINE = "mysql_old"
然而,我们强烈建议 MySQL 用户尽快升级到最新版本的 MySQLdb
,提供 “mysql_old” 后端只是为了方便过渡,并且被认为是废弃的;除了任何必要的安全修复,它将不会被积极维护,并将在未来的 Django 版本中删除。
另外,需要注意的是,有些功能,比如新的 DATABASE_OPTIONS
配置(详见 数据库文档 ),只在 “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
。Django 数据库 API 现在可以转义作为查询参数的反斜线。如果你有任何匹配反斜线的数据库 API 代码,并且之前还能正常工作(尽管没有转义),你必须修改你的代码,将斜线“取消转义”一个级别。
例如,下面的查询在以前可以生效:
# Find text containing a single backslash
MyModel.objects.filter(text__contains="\\\\")
但在现在上面的命令不再正确了,并且应该重写为下面这样:
# Find text containing a single backslash
MyModel.objects.filter(text__contains="\\")
本次版本号的更改代表有超过 1000 次代码提交和超过 400 次漏洞修复,所以我们不能详细罗列所有的变化。在这里我们将描述本次发布中最为重要的变化。
django.newforms
是 Django 新的表单处理库。它是 django.forms
这个旧的表单/操作器/验证框架的一个替代。这两个 API 在 0.96 版本中都可用,但在接下来的两个版本发布中,我们计划完全切换到新的表单系统,并标记失效和移除旧的系统。
针对这个的过渡将分三步:
我们已经将当前的 django.forms
复制到了 django.oldforms
。这将允许你 现在 升级你的代码而不是等待向后不兼容的改变,然后匆忙修复你的代码。只需要像下面这样更改你的 import 声明:
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
的信息,请阅读 新表单。
现在,你可以在 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))
请注意,这两种语法(字符串和可调用对象)都是有效的,并且在可预见的未来将继续有效。
Django 现在包含了一个测试框架,所以你可以开始将恐惧转化为无聊(向 Kent Beck 道歉)。你可以基于 doctest
或 unittest
来编写测试,并用一个简单的测试客户端来测试你的视图。
还有对 “固定数据” 的新支持——初始数据,存储在任何支持的 序列化格式 中,将在测试开始时加载到你的数据库中。这使得使用真实数据进行测试变得更加容易。
详见 测试文档。
一个很小但是很不错的修改:在管理界面中增加了用于添加和更新用户的专用视图,所以你不再需要担心在管理中使用哈希密码的问题。
从版本 0.95 起,有许多人站了出来并在 Django 的项目发展中扮演了主要角色。我们想要向这些人的辛勤工作表达我们的谢意。
5月 31, 2023