Django 1.0 release notes

欢迎来到Django 1.0!

我们一直期待这一刻的三年多,它终于在这里。Django 1.0代表了Django迄今为止开发中的最大里程碑:一组完美主义者可以真正感到自豪的Web框架。

Django 1.0代表了三年的社区发展作为一个开源项目。Django从数百个开发人员那里收到了贡献,被翻译成五十种语言,今天被开发商在每个大陆和各种工作中使用。

一个有趣的历史注释:当Django在2005年7月首次发布时,Django的初始发布版本来自修订版号为8825的内部存储库。Django 1.0表示我们的公共存储库的修订8961。看来,我们的1.0版本是在社区贡献超越私有的时候。

Stability and forwards-compatibility

The release of Django 1.0附带了API稳定性和向前兼容性的承诺。简而言之,这意味着,您针对Django 1.0开发的代码将继续对1.1不变,并且您应该需要对任何1.X版本进行小的更改。

有关详细信息,请参阅API stability guide

Backwards-incompatible changes

Django 1.0有一些来自Django 0.96的向后不兼容的更改。如果您有针对Django 0.96编写的应用程序,您需要移植,请参阅我们的详细移植指南:

有关向后兼容性更改的完整列表,请访问https://code.djangoproject.com/wiki/BackwardsIncompatibleChanges

What’s new in Django 1.0

A 很多

自Django 0.96以来,我们已经完成了超过4000个代码提交,修复了超过2000个错误,并且编辑,添加或删除了大约350,000行代码。我们还添加了40,000行新文档,并大大改进了已经存在的内容。

事实上,新的文档是我们最喜欢的Django 1.0的特性之一,所以我们可以从那里开始。首先,有一个新的文档站点:

文档已经大大改进,清理,并通常做出真棒。现在有专门的搜索,索引,等等。

我们不可能记录1.0中的新内容,但文档将是您的最终指南。在任何地方,你看到像:

Django 1.0中的新功能:

此功能是Django 1.0中的新功能

你会知道你在看新的东西或改变。

Django 1.0的其他主要亮点是:

Re-factored admin application

Django管理界面(django.contrib.admin)已完全重构;管理定义现在与模型定义完全解耦(在模型中不再有 Admin),重写为使用Django的新形式处理库(在0.96版本中作为django.newforms引入,现在仅作为django.forms),并重新设计了可扩展性和定制化。管理应用程序的完整文档可在官方Django文档中在线获取:

有关详细信息,请参阅admin reference

Improved Unicode handling

Django的内部结构被重构以使用Unicode;这大大简化了在Django中处理非西欧内容和数据的任务。此外,提供了效用函数来简化与第三方库和系统的互操作性,这些库和系统可能或可能不会优雅地处理Unicode。Django的Unicode处理文档中提供了详细信息。

请参见Unicode data

An improved ORM

Django的对象关系映射器 - 提供Django模型类和数据库之间的映射,并且调解您的数据库查询的组件 - 已经通过大规模重构得到了显着的改进。对于大多数Django用户来说,这是向后兼容的;用于数据库查询的面向公众的API经历了一些小的更改,但大多数更新发生在ORM的内部。Django wiki上提供了有关更改的指南,包括由此重构打开的新功能的向后不兼容修改和提及,

Automatic escaping of template variables

为了提高对跨站点脚本(XSS)漏洞的安全性,Django的模板系统现在自动转义变量的输出。此行为是可配置的,并允许变量和较大的模板结构标记为安全(无需转义)或不安全(需要转义)。此功能的完整指南位于autoescape标记的文档中。

django.contrib.gis (GeoDjango)

经过一年多时间的项目,它以contrib应用程序的形式为Django添加了世界级的GIS(地理信息系统)支持。它的文档目前正在外部维护,很快就会被合并到Django的主文档中。非常感谢Justin Bronn,Jeremy Dunck,Brett Hoerner和Travis Pinney为创建和完成这个功能所做的努力。

有关详细信息,请参见http://geodjango.org/

Pluggable file storage

Django的内置FileFieldImageField现在可以利用可插拔文件存储后端,允许广泛定制Django存储位置和上传文件的方式。有关详细信息,请参阅the files documentation;大感谢Marty Alchin投入艰苦的工作,使这完成。

Jython compatibility

感谢Leo Soto在Google Summer of Code项目中的大量工作,Django的代码库已被重构,以消除与Jython(一种使用Java编写的Python的实现)不兼容的问题,后者在Java上运行Python代码虚拟机。Django现在与即将到来的Jython 2.5版本兼容。

请参阅Running Django on Jython

Generic relations in forms and admin

类现在包括在django.contrib.contenttypes中,可用于在管理界面和最终用户表单中支持通用关系。有关详细信息,请参见the documentation for generic relations

INSERT/UPDATE distinction

尽管Django的默认行为是使用模型的save()方法自动确定是否在SQL级别执行INSERTUPDATE在大多数情况下,偶尔会出现强制一种或另一种有用的情况。因此,模型现在可以为save()支持一个附加参数,可以强制执行特定操作。

有关详细信息,请参见Forcing an INSERT or UPDATE

Split CacheMiddleware

Django’s CacheMiddleware has been split into three classes: CacheMiddleware itself still exists and retains all of its previous functionality, but it is now built from two separate middleware classes which handle the two parts of caching (inserting into and reading from the cache) separately, offering additional flexibility for situations where combining these functions into a single middleware posed problems.

完整详情(包括适当使用的更新说明)位于the caching documentation中。

Refactored django.contrib.comments

作为Google Summer of Code项目的一部分,Thejaswi Puthraya对Django的捆绑评论系统进行了重大的重写和重构,极大地提高了其灵活性和可定制性。

Removal of deprecated features

之前已标记为已弃用,并计划在1.0版本之前删除的许多功能和方法不再存在于Django中。These include imports of the form library from django.newforms (now located simply at django.forms), the form_for_model and form_for_instance helper functions (which have been replaced by ModelForm) and a number of deprecated features which were replaced by the dispatcher, file-uploading and file-storage refactorings introduced in the Django 1.0 alpha releases.

Known issues

我们已尽最大努力使Django 1.0尽可能稳定,但不幸的是,我们在发行版中知道了几个问题。

Multi-table model inheritance with to_field

如果您使用multiple table model inheritance,请注意以下警告:使用自定义parent_linkto_field的子模型将导致数据库完整性错误。一组如下的模型无效

class Parent(models.Model):
    name = models.CharField(max_length=10)
    other_value = models.IntegerField(unique=True)

class Child(Parent):
    father = models.OneToOneField(Parent, primary_key=True, to_field="other_value", parent_link=True)
    value = models.IntegerField()

这个bug将在下一个Django版本中修复。

Caveats with support of certain databases

Django尝试在所有数据库后端支持尽可能多的功能。但是,并非所有数据库后端都是相同的,特别是许多受支持的数据库在不同版本之间存在很大差异。建议您在支援的资料库上查看我们的notes on supported database