Django version 0.96 release notes

欢迎来到Django 0.96!

0.96的主要目标是清理和稳定0.95中引入的特征。自0.95以来,已经出现了一些小的向后不兼容的更改,但是升级过程应该相当简单,并且不需要对现有应用程序进行重大更改。

但是,我们现在也发布0.96,因为我们有一组向后兼容的更改计划在不久的将来。一旦完成,他们将涉及一些代码更改为应用程序开发人员,所以我们建议你坚持使用Django 0.96直到下一个正式发布;那么您将能够在一个步骤中升级,而不需要进行增量更改以跟上Django的开发版本。

Backwards-incompatible changes

以下更改可能需要您在从0.95切换到0.96时更新代码:

MySQLdb version requirement

由于旧版本的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设置(有关详细信息,请参见databases documentation)仅在“mysql”后端可用,可用于“mysql_old”。

Database constraint names changed

外键引用的Django生成的约束名称的格式稍有变化。这些名称通常仅在不可能直接将引用放在受影响的列上时使用,因此它们并不总是可见的。

此更改的效果是,对现有数据库运行manage.py 重置和类似命令可能会生成具有新形式的约束名称的SQL ,而数据库本身包含以旧形式命名的约束;这将导致数据库服务器提出关于修改不存在的约束的错误消息。

如果你需要解决这个问题,有两种方法可用:

  1. manage.py的输出重定向到文件,并在执行生成的SQL之前编辑生成的SQL以使用正确的约束名称。
  2. 检查manage.py sqlall的输出以查看新样式的约束名称,并将其用作重命名数据库。

Name changes in manage.py

添加灯具支持后,manage.py的几个选项已更改:

  • 有新的dumpdataloaddata命令,如您所料,将从数据库转储和加载数据。这些命令可以操作任何Django支持的序列化格式。
  • sqlinitialdata命令已重命名为sqlcustom,以强调loaddata应用于数据(和sqlcustom自定义SQL - 视图,存储过程等。)。
  • 已删除残留的install命令。使用syncdb

Backslash escaping changed

Django数据库API现在转义作为查询参数给出的反斜杠。如果你有任何数据库API代码匹配反斜杠,并且它在之前工作(尽管缺少转义),你必须更改你的代码,以便将斜杠“unes​​cape”一个级别。

例如,这以前工作:

# Find text containing a single backslash
MyModel.objects.filter(text__contains='\\\\')

以上现在不正确,应重写为:

# Find text containing a single backslash
MyModel.objects.filter(text__contains='\\')

Removed ENABLE_PSYCO setting

ENABLE_PSYCO设置已不存在。如果您的设置文件包含ENABLE_PSYCO,则它将不起作用;要使用Psyco,我们建议编写一个中间件类来激活它。

What’s new in 0.96?

此版本代表了超过一千个源提交和四百多个错误修复,因此我们无法将所有更改编入目录。在这里,我们描述在这个版本中最显着的变化。

New forms library

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的用户将需要如上所述更改其import语句。

  • 之后的下一个版本将完全删除django.oldforms

虽然newforms库将继续发展,但它可以在大多数常见情况下使用。我们建议任何新的表单处理的人跳过旧表单系统,并从新的。

有关django.newforms的详细信息,请参阅newforms documentation

URLconf improvements

您现在可以使用任何可调用作为URLconfs中的回调(以前,仅允许引用callables的字符串)。这允许更自然地使用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)
)

注意,这两种语法(字符串和可调用)都是有效的,并且在可预见的未来将继续有效。

The test framework

Django现在包括一个测试框架,所以你可以开始将恐惧变成无聊(对Kent Beck抱歉)。您可以根据doctestunittest编写测试,并使用简单的测试客户端测试您的视图。

还有对“fixtures”的新支持 - 初始数据,存储在任何支持的serialization formats中,将在测试开始时加载到数据库中。这使得使用真实数据的测试变得容易得多。

有关完整详细信息,请参见the testing documentation

Improvements to the admin interface

一个小的变化,但一个非常好的:添加和更新用户的专用视图已添加到管理界面,所以你不再需要担心在管理员中使用散列密码。

Thanks

自0.95年以来,一些人已经前进,在Django的发展中发挥了重要的新作用。我们要感谢这些人的辛勤工作:

  • Russell Keith-Magee和Malcolm Tredinnick的主要代码贡献。如果没有他们,这个版本是不可能的。
  • 我们的新发行经理James Bennett,因为他在出手0.95.1,0.96和(希望)未来版本的工作。
  • 我们的票务经理Chris Beaven(又名SmileyChris),Simon Greenhill,Michael Radziej和Gary Wilson。他们同意承担重要的任务,把我们的车票打成精美的目录提交。想知道什么工作现在是大约一百万倍更容易;再次感谢,伙计们。
  • 每个提交错误报告,补丁或票据评论的人。我们不能以名称感谢每个人 - 超过200个开发者提交的补丁进入0.96 - 但每个贡献给Django的人都列在AUTHORS中。