Django 1.8发行说明

2015年4月1日

欢迎来到Django 1.8!

这些发行说明涵盖了 new features 以及一些 backwards incompatible changes 从django 1.7或更旧版本升级时,您需要注意。我们也 begun the deprecation process for some features 和一些特性已经达到了它们的折旧过程的末尾,并且 have been removed .

如何将Django升级到更新版本 如果正在更新现有项目,则提供指南。

Django 1.8被指定为Django的第二个 long-term support release . 它将在发布后至少三年内收到安全更新。对先前LTS的支持,django 1.4,将在django 1.8发布之日起6个月后结束。

python兼容性

Django1.8需要python 2.7、3.2、3.3、3.4或3.5。我们 强烈推荐 只有官方支持每个系列的最新版本。

Django1.8是第一个支持Python3.5的版本。

由于2016年2月结束了对python 3.2的上游支持,我们不会在2016年底后在python 3.2上测试django 1.8.x。

Django 1.8的新功能

Model._meta API

Django现在有一个正式的API Model._meta 提供官方支持的方式 retrieve fields 并根据其筛选字段 attributes .

这个 Model._meta 从0.96之前的“魔法移除”时代起,Object就一直是Django的一部分——它不是一个官方的、稳定的API。认识到这一点,我们已经尽力尽可能地保持与旧API端点的向后兼容性。但是,不属于新的官方API的API端点已被弃用,最终将被删除。

多模板引擎

Django1.8为集成模板后端定义了一个稳定的API。它包括对django模板语言和 Jinja2 . 它支持在同一个项目中使用多个引擎呈现模板。进一步了解中的新功能 topic guide 并查看旧版本文档中的升级说明。

增强的安全性

的几个功能 django-secure 第三方库已集成到Django中。 django.middleware.security.SecurityMiddleware 为请求/响应周期提供多项安全增强功能。新的 check --deploy 选项允许您检查您的生产设置文件,以了解如何提高站点的安全性。

新的PostgreSQL特定功能

Django现在有一个模块,扩展了PostgreSQL特有的特性,例如 ArrayFieldHStoreField距离场unaccent 查找。功能的完整分解可用 in the documentation .

新数据类型

  • Django现在有一个 UUIDField 用于存储通用的唯一标识符。它作为本机存储 uuid PostgreSQL上的数据类型以及其他后端上的固定长度字符字段。有一个对应的 form field .

  • Django现在有一个 DurationField 用于存储在python中由 timedelta . 它存储在本地 interval PostgreSQL上的数据类型,作为 INTERVAL DAY(9) TO SECOND(6) 在Oracle上,作为 bigint 其他后端的毫秒数。所有后端的日期和时间相关算法也都得到了改进。有一个对应的 form field .

查询表达式、条件表达式和数据库函数

Query Expressions 允许您创建、自定义和组合复杂的SQL表达式。这使Annotate可以接受聚合以外的表达式。聚合现在可以引用多个字段,也可以执行算术,类似于 F() 对象。 order_by() 也获得了接受表达的能力。

Conditional Expressions 允许您使用 ifelifelse 查询中的逻辑。

收藏 database functions 也包括在功能中,例如 CoalesceConcatSubstr .

TestCase 数据设置

TestCase 已重构,以允许使用事务和保存点在类级别初始化数据。不支持事务的数据库后端(如带有myisam存储引擎的mysql)仍然可以运行这些测试,但不会从改进中受益。测试现在在两个嵌套的 atomic() 块:一个用于整个类,一个用于每个测试。

  • 类方法 TestCase.setUpTestData() 添加了在类级别设置测试数据的功能。与使用此技术相比,使用此技术可以加快测试速度 setUp()

  • 夹具加载范围 TestCase 现在只执行一次 TestCase .

次要特征

django.contrib.admin

  • ModelAdmin 现在有一个 has_module_permission() 方法来限制对管理索引页上模块的访问。

  • InlineModelAdmin 现在有了一个属性 show_change_link 它支持显示指向内联对象的更改窗体的链接。

  • 使用新的 django.contrib.admin.RelatedOnlyFieldListFilter 在里面 ModelAdmin.list_filter 限制 list_filter 选择与来自 ModelAdmin .

  • 这个 ModelAdmin.delete_view() 在删除确认页上显示要删除的对象的摘要。

  • 嵌入在管理中的jquery库已升级到1.11.2版。

  • 现在可以指定 AdminSite.site_url 以便显示到前端站点的链接。

  • 现在可以指定 ModelAdmin.show_full_result_count 控制是否应在已筛选的管理页上显示对象的完整计数。

  • 这个 AdminSite.password_change() 方法现在有一个 extra_context 参数。

  • 现在,您可以通过仅覆盖来控制谁可以登录管理站点。 AdminSite.has_permission()AdminSite.login_form . 这个 base.html 模板有一个新块 usertools 其中包含用户特定的标题。新的上下文变量 has_permission ,它的值来自 has_permission() ,指示用户是否可以访问该网站。

  • 外键下拉列表现在有按钮,可以使用弹出窗口更改或删除相关对象。

django.contrib.admindocs

  • RestructuredText现在在模型docStrings中进行分析。

django.contrib.auth

django.contrib.gis

  • 一个新的 GeoJSON serializer 现在可用。

  • 例如,现在允许将子查询包含为地理查找参数 City.objects.filter(point__within=Country.objects.filter(continent='Africa').values('mpoly')) .

  • 空间站点后端现在支持 CollectExtent 当数据库版本为3.0或更高版本时聚合。

  • PostGIS2 CREATE EXTENSION postgis 还有太空人 SELECT InitSpatialMetaData 初始化命令现在由自动运行 migrate .

  • gdal接口现在支持检索 raster (image) data file .

  • 兼容性垫片 SpatialRefSysGeometryColumns Django 1.2中的更改已删除。

  • 所有与gdal相关的异常现在用引发 GDALException . 前者 OGRException 为向后兼容而保留,但不应再使用。

django.contrib.sessions

  • 会话cookie现在在之后被删除 flush() 被称为。

django.contrib.sitemaps

django.contrib.sites

隐藏物

  • 这个 incr() 方法 django.core.cache.backends.locmem.LocMemCache 后端现在是线程安全的。

密码学

数据库后端

  • MySQL后端不再从 datetime mysql 5.6.4及更高版本的值支持小数秒,具体取决于datetime字段的声明(当 DATETIME 包括大于0的分数精度)。使用django 1.8和mysql 5.6.4及更高版本创建的新datetime数据库列将支持微秒。见 MySQL database notes 了解更多详细信息。

  • 当使用innodb存储引擎时,mysql后端不再为外键创建显式索引,因为mysql已经自动创建了它们。

  • Oracle后端不再定义 connection_persists_old_columns 特征为 True . 相反,在获取表的描述时,Oracle现在将包含一个缓存总线子句。

电子邮件

文件存储

  • Storage.get_available_name()Storage.save() 现在采取 max_length 用于实现存储级别最大文件名长度约束的参数。超过此参数的文件名将被截断。这可以防止在将唯一后缀附加到存储中已存在的长文件名时出现数据库错误。见 deprecation note 关于将此参数添加到自定义存储类。

形式

  • 表单小部件现在呈现值为的属性 TrueFalse 作为HTML5布尔属性。

  • 新的 has_error() 方法允许检查是否发生了特定错误。

  • 如果 required_css_class 在窗体上定义,然后 <label> 必需字段的标记将在其属性中存在此类。

  • 无序列表中非字段错误的呈现 (<ul> 现在包括 nonfield 在它的类列表中,将它们与特定于字段的错误区分开来。

  • Field 现在接受 label_suffix 参数,它将重写窗体的 label_suffix . 这样就可以在每个字段的基础上自定义后缀-以前不可能重写窗体的 label_suffix 使用快捷方式时,如 {{{{ form.as_p }}}} 在模板中。

  • SelectDateWidget 现在接受一个 empty_label 参数,当 DateField 不是必需的。

  • 后一 ImageField 已经过清洗和验证, UploadedFile 对象将具有附加的 image 包含枕头的属性 Image 用于检查文件是否为有效图像的实例。它还将更新 UploadedFile.content_type 图像的内容类型由枕头决定。

  • 现在可以传递一个可调用文件,该文件在实例化 ChoiceField .

通用视图

国际化

  • FORMAT_MODULE_PATH 现在可以是表示模块路径的字符串列表。这允许从不同的可重用应用程序导入多个格式模块。它还允许覆盖主Django项目中的那些自定义格式。

登录

管理命令

  • 数据库连接现在总是在从命令行调用的管理命令完成其工作后关闭。

  • 现在还发现了来自其他包格式(如eggs)的命令。

  • 新的 dumpdata --output 选项允许指定将序列化数据写入的文件。

  • 新的 makemessages --excludecompilemessages --exclude 选项允许从处理中排除特定区域设置。

  • compilemessages 现在有一个 --use-fuzzy-f 选项,其中包括到编译文件的模糊翻译。

  • 这个 loaddata --ignorenonexistent 选项现在忽略不再存在的模型的数据。

  • runserver 现在使用守护进程线程来更快地重新加载。

  • inspectdb 现在输出 Meta.unique_together . 它还能够反省 AutoField 用于mysql和postgresql数据库。

  • 使用选项调用管理命令时使用 call_command() ,选项名可以匹配命令行选项名(不带初始破折号)或最终选项目标变量名,但在这两种情况下,命令接收的结果选项现在总是 dest 在命令选项定义中指定的名称(只要命令使用 argparse 模块)。

  • 这个 dbshell 命令现在支持MySQL的可选SSL证书颁发机构设置 (--ssl-ca

  • 新的 makemigrations --name 允许为迁移指定自定义名称而不是生成的名称。

  • 这个 loaddata 命令现在可防止重复加载夹具。如果 FIXTURE_DIRS 包含重复项或默认设备目录路径 (app_name/fixtures )引发异常。

  • 新的 makemigrations --exit 如果没有创建迁移,则选项允许退出并返回错误代码。

  • 新的 showmigrations 命令允许列出项目中的所有迁移及其依赖项。

中间件

迁徙

模型

  • Django现在在 connections.queries ,以防止在调试模式下长时间运行的进程中使用过多的内存。

  • 现在有一个模型 Meta 用于定义 default related name 对于模型的所有关系字段。

  • 不同版本的django中的pickle模型和查询集没有得到官方支持(可能有效,但没有保证)。指定当前django版本的额外变量现在添加到模型和查询集的pickled状态,django引发 RuntimeWarning 当这些对象以不同于被腌制对象的版本被取出时。

  • 补充 Model.from_db() 每当使用ORM加载对象时,Django都使用它。该方法允许自定义模型加载行为。

  • extra(select={{...}}) 现在允许您转义文字 %s 序列使用 %%s .

  • Custom Lookups 现在可以使用decorator模式注册。

  • 新的 Transform.bilateral 属性允许创建双边转换。这些转换同时应用于 lhsrhs 在查找表达式中使用时,为更复杂的查找提供机会。

  • 当模式查找(例如 containsstartswith 等)与 F() 表达为右手边。在这些情况下,转义是由数据库执行的,这可能导致一些涉及嵌套的复杂查询 REPLACE 函数调用。

  • 现在可以使用 Model.refresh_from_db() .

  • 现在可以使用 Model.get_deferred_fields() .

  • 模型场 default 当主键字段设置为时,现在使用的是 None .

信号

  • 例外 (receiver, exception) 元组返回者 Signal.send_robust() 现在把它们的回溯作为 __traceback__ 属性。

  • 这个 environ 已将包含来自请求的wsgi环境结构的参数添加到 request_started 信号。

  • 现在可以导入 setting_changed() 信号来自 django.core.signals 避免装载 django.test 在非测试情况下。 Django 自己不再这样做了。

系统检查框架

模板

  • urlize 现在只支持包含顶级域后字符的域链接(例如 djangoproject.com/djangoproject.com/download/

  • urlize 不将域结尾的感叹号或其查询字符串视为URL的一部分(例如 'djangoproject.com!djangoproject.com

  • 增加了一个 locmem.Loader 从Python字典加载django模板的类。

  • 这个 now 标记现在可以用常规语法将其输出存储在上下文变量中: {{% now 'j n Y' as varname %}} .

请求和响应

  • WSGIRequest 现在尊重从 // .

  • 这个 HttpRequest.build_absolute_uri() 方法现在处理以 // 正确地。

  • 如果 DEBUGTrue 一个请求引发一个 SuspiciousOperation ,将使用详细的错误页呈现响应。

  • 这个 query_string 的参数 QueryDict 现在是可选的,默认为 None 一片空白 QueryDict 现在可以用实例化 QueryDict() 而不是 QueryDict(None)QueryDict('') .

  • 这个 GETPOST 的属性 HttpRequest 对象现在 QueryDict 而不是字典, FILES 属性现在是 MultiValueDict . 这使这个类与文档和 WSGIRequest .

  • 这个 HttpResponse.charset 已添加属性。

  • WSGIRequestHandler 现在遵循RFC将URI转换为IRI,使用 uri_to_iri() .

  • 这个 HttpRequest.get_full_path() 方法现在可以正确地从统一资源标识符(URI)的路径部分转义不安全的字符。

  • HttpResponse 现在实现了一些额外的方法,比如 getvalue() 这样实例就可以用作流对象。

  • 新的 HttpResponse.setdefault() 方法允许设置头,除非已经设置了头。

  • 你可以用新的 FileResponse 传输文件。

  • 这个 condition() 条件视图处理的decorator现在支持 If-unmodified-since 标题。

测验

验证器

  • URLValidator 现在支持IPv6地址、Unicode域和包含身份验证数据的URL。

1.8中的向后不兼容更改

警告

除了本节概述的更改外,请务必查看 deprecation plan 对于任何已删除的功能。如果您没有在取消预测时间线内更新给定功能的代码,则删除该功能可能会显示为向后不兼容的更改。

将未保存的对象分配给关系会引发错误

备注

为了更容易地允许在内存中使用模型,Django 1.8.4中恢复了这一更改,并在 model.save() 。例如:

>>> book = Book.objects.create(name="Django")
>>> book.author = Author(name="John")
>>> book.save()
Traceback (most recent call last):
...
ValueError: save() prohibited to prevent data loss due to unsaved related object 'author'.

Django 1.8.5中取消了对反向一对一关系分配的类似检查。

将未保存的对象分配给 ForeignKeyGenericForeignKeyOneToOneField 现在提出一个 ValueError .

以前,未保存对象的分配将被静默忽略。例如:

>>> book = Book.objects.create(name="Django")
>>> book.author = Author(name="John")
>>> book.author.save()
>>> book.save()

>>> Book.objects.get(name="Django")
>>> book.author
>>>

现在,将引发一个错误以防止数据丢失:

>>> book.author = Author(name="john")
Traceback (most recent call last):
...
ValueError: Cannot assign "<Author: John>": "Author" instance isn't saved in the database.

如果您需要允许分配未保存的实例(旧行为),并且不关心数据丢失的可能性(例如从不将对象保存到数据库),则可以使用 ForeignKey.allow_unsaved_instance_assignment 属性。(此属性已在1.8.4中删除,因为它不再相关。)

只接受位置参数的管理命令

如果编写的自定义管理命令只接受位置参数,而没有指定 args 命令变量,您可能会得到如下错误: Error: unrecognized arguments: ... ,因为变量解析现在基于 argparse 它不会隐式接受位置参数。只需设置 args 类变量。但是,如果您不必与旧的django版本保持兼容性,最好实现新的 add_arguments() 方法如中所述 如何创建自定义 django-admin 命令 .

通过测试运行程序自定义测试管理命令参数

将自定义参数添加到 test 通过测试运行程序的管理命令已更改。以前,您可以提供 option_list 测试运行程序上的类变量以添加更多参数(_la optparse )现在要实现相同的行为,必须创建 add_arguments(cls, parser) 测试运行程序上的类方法并调用 parser.add_argument 添加任何自定义参数,因为解析器现在是 argparse.ArgumentParser 实例。

模型检查确保自动生成的列名在数据库指定的范围内

超过数据库支持的列名长度的字段名可能会产生问题。例如,使用MySQL,在尝试创建列时会得到一个异常,而使用PostgreSQL,列名称会被数据库截断(您可能会在PostgreSQL日志中看到警告)。

在实际创建数据库表之前,已经引入了一个模型检查来更好地提醒用户注意这个场景。

如果您有一个现有的模型,在这个模型中,这个检查似乎是一个误报,例如在已经被截断名称的PostgreSQL上,只需使用 db_column 指定正在使用的名称。

该检查还适用于隐式 ManyToManyField.through 模型。如果在那里遇到问题,请使用 through 创建显式模型,然后指定 db_column 根据需要在其列上。

查询关系查找现在检查对象类型

现在查询模型查找会检查传递的对象的类型是否正确,并引发 ValueError 如果没有的话。以前,Django并不关心对象的类型是否正确;它只使用对象的相关字段属性(例如 id )用于查找。现在,将引发一个错误以防止错误的查找:

>>> book = Book.objects.create(name="Django")
>>> book = Book.objects.filter(author=book)
Traceback (most recent call last):
...
ValueError: Cannot query "<Book: Django>": Must be "Author" instance.

违约 EmailField.max_length 增加到254

旧的默认值75个字符 max_length 无法存储所有可能的符合RFC3696/5321的电子邮件地址。为了存储所有可能的有效电子邮件地址, max_length 已增加到254个字符。您需要为受影响的模型生成和应用数据库迁移(或添加 max_length=75 如果希望保留当前字段的长度)。迁徙 django.contrib.auth.models.User.email 包括在内。

支持9.0以上的PostgreSQL版本

PostgreSQL 8.4的上游支持期已于2014年7月结束。因此,Django1.8将9.0设置为它正式支持的最小PostgreSQL版本。

这还包括放弃对Postgis1.3和1.4的支持,因为在8.4之后的PostgreSQL版本上不支持这些版本。

Django现在还需要使用psycopg2 2.4.5或更高版本(如果您想使用,请使用2.5+ django.contrib.postgres

支持5.5以上版本的MySQL

2012年1月MySQL5.0的上游支持期结束,2013年12月MySQL5.1的上游支持期结束。因此,django 1.8将5.5设置为它正式支持的最低mysql版本。

支持11.1之前的Oracle版本

Oracle 9.2的上游支持期已于2010年7月结束,Oracle 10.1的支持期已于2012年1月结束,Oracle 10.2的支持期已于2013年7月结束。因此,Django1.8将11.1设置为它正式支持的最低Oracle版本。

用于Oracle上测试的特定权限,而不是角色

Django的早期版本将connect和resource角色授予了Oracle上的测试用户。这些角色已被弃用,因此Django1.8使用特定的底层特权。这将更改主用户运行测试所需的特权(除非项目配置为避免创建测试用户)。现在所需的确切权限在 Oracle notes .

AbstractUser.last_login 允许空值

这个 AbstractUser.last_login 字段现在允许空值。以前,它默认为创建用户的时间,如果用户从未登录,则会产生误导。如果您使用的是默认用户 (django.contrib.auth.models.User ,运行中包含的数据库迁移 contrib.auth .

如果使用的自定义用户模型继承自 AbstractUser ,你需要运行 makemigrations 并为包含该模型的应用程序生成迁移。另外,如果想设置 last_loginNULL 对于尚未登录的用户,可以运行此查询::

from django.db import models
from django.contrib.auth import get_user_model
from django.contrib.auth.models import AbstractBaseUser

UserModel = get_user_model()
if issubclass(UserModel, AbstractBaseUser):
    UserModel._default_manager.filter(last_login=models.F("date_joined")).update(
        last_login=None
    )

django.contrib.gis

  • 对geos 3.1和gdal 1.6的支持已被取消。

  • 已放弃对小于2.4的空间陨石的支持。

  • 对特定于GIS的查找进行了重构,以使用 django.db.models.Lookup 应用程序编程接口。

  • 默认值 str 代表 GEOSGeometry 对象已从wkt更改为ewkt格式(包括srid)。因为这个表示在序列化框架中使用,这意味着 dumpdata 现在输出将包含几何体对象的srid值。

上下文处理器的优先级 TemplateResponse 与…一致 render

这个 TemplateResponse 构造函数被设计为 render() 功能。但是,它有一点不相容性,因为 TemplateResponse ,传入的上下文字典中的上下文数据可以由上下文处理器返回的上下文数据隐藏,而对于 render 相反。这是一个错误,而且 render 更合适,因为它允许在视图中本地重写全局定义的上下文处理器。如果您依赖的是 TemplateResponse 可以使用上下文处理器重写,您需要更改代码。

压倒一切 setUpClass / tearDownClass 在测试用例中

装饰家 override_settings()modify_settings() 现在,当用作类修饰符时,在类级别执行操作。因此,当 setUpClass()tearDownClass() , the super 应始终调用实现。

移除 django.contrib.formtools

Formtools Contrib应用程序已移动到单独的包中,相关文档页已更新或删除。

有新的套餐 on GitHub 在PyPI上。

在测试之间重新加载数据库连接

Django以前关闭了 TestCase . 这已经不是问题了,因为德扬戈现在把整个 TestCase 在事务中。如果您的一些测试依赖于旧的行为,您应该让它们继承自 TransactionTestCase 相反。

清理 django.template 命名空间

如果您一直依赖于 django.template 模块,您可能需要从 django.template.base 相反。

也是私有API django.template.base.compile_string()django.template.loader.find_template()django.template.loader.get_template_from_string() 被移除。

model 私有模型关系的属性

在早期版本的django中,在具有反向外键关系的模型上(例如, model._meta.get_all_related_objects() 将关系作为 django.db.models.related.RelatedObjectmodel 属性设置为关系的源。现在,此方法将关系返回为 django.db.models.fields.related.ManyToOneRel (私有API) RelatedObject 已删除),并且 model 属性设置为关系的目标而不是源。源模型可在上访问 related_model 改为属性。

考虑Django 1.8中的教程中的这个例子:

>>> p = Poll.objects.get(pk=1)
>>> p._meta.get_all_related_objects()
[<ManyToOneRel: polls.choice>]
>>> p._meta.get_all_related_objects()[0].model
<class 'polls.models.Poll'>
>>> p._meta.get_all_related_objects()[0].related_model
<class 'polls.models.Choice'>

并将其与旧版本的行为进行比较:

>>> p._meta.get_all_related_objects()
[<RelatedObject: polls:choice related to poll>]
>>> p._meta.get_all_related_objects()[0].model
<class 'polls.models.Choice'>

要访问源模型,您可以使用类似这样的模式来编写代码,这些代码将与Django1.8和旧版本同时使用:

for relation in opts.get_all_related_objects():
    to_model = getattr(relation, "related_model", relation.model)

还要注意 get_all_related_objects() 在1.8中已弃用。

数据库后端API

记录对数据库后端API的以下更改,以帮助编写第三方后端的人员更新其代码:

  • BaseDatabaseXXX 课程已转移到 django.db.backends.base . 请从新位置导入:

    from django.db.backends.base.base import BaseDatabaseWrapper
    from django.db.backends.base.client import BaseDatabaseClient
    from django.db.backends.base.creation import BaseDatabaseCreation
    from django.db.backends.base.features import BaseDatabaseFeatures
    from django.db.backends.base.introspection import BaseDatabaseIntrospection
    from django.db.backends.base.introspection import FieldInfo, TableInfo
    from django.db.backends.base.operations import BaseDatabaseOperations
    from django.db.backends.base.schema import BaseDatabaseSchemaEditor
    from django.db.backends.base.validation import BaseDatabaseValidation
    
  • 这个 data_typesdata_types_suffixdata_type_check_constraints 属性已从 DatabaseCreation 类到 DatabaseWrapper .

  • 这个 SQLCompiler.as_sql() 方法现在采用 subquery 参数 (#24164

  • 这个 BaseDatabaseOperations.date_interval_sql() 方法现在只接受 timedelta 参数。

django.contrib.admin

  • AdminSite 不再需要 app_name 论点及其意义 app_name 属性已被删除。应用程序名称总是 admin (与您仍然可以使用自定义的实例名称不同 AdminSite(name="...") .

  • 这个 ModelAdmin.get_object() 方法(private api)现在接受名为 from_field 为了指定哪个字段应与提供的 object_id .

  • 这个 ModelAdmin.response_delete() 方法现在接受名为 obj_id 它是用于在删除前检索对象的序列化标识符。

中函数的默认自动转义 django.template.defaultfilters

为了在用python代码调用HTML时使输出HTML的内置模板过滤器“默认情况下是安全的”,中的以下函数 django.template.defaultfilters 已更改为自动转义其输入值:

  • join

  • linebreaksbr

  • linebreaks_filter

  • linenumbers

  • unordered_list

  • urlize

  • urlizetrunc

您可以通过指定 autoescape=False 如果传递的是可信内容。在模板中使用相应的筛选器时,此更改没有任何效果。

其他

  • connections.queries 现在是只读属性。

  • 只有当数据库连接是同一对象时,才认为它们是相等的。它们不再是可散列的。

  • GZipMiddleware 用于在请求来自Internet Explorer时禁用某些内容类型的压缩,以解决IE6和更早版本中的错误。此行为可能会影响IE7和更高版本的性能。它被移除了。

  • URLField.to_python 不再向无路径URL添加尾随斜杠。

  • 这个 length 模板过滤器现在返回 0 对于未定义的变量,而不是空字符串。

  • ForeignKey.default_error_message['invalid'] 已从更改 '%(model)s instance with pk %(pk)r does not exist.''%(model)s instance with %(field)s %(value)r does not exist.' 如果您在自己的代码中使用此消息,请更新插入参数列表。在内部,Django将继续提供 pk 参数在 params 为了向后兼容。

  • UserCreationForm.error_messages['duplicate_username'] 不再使用。如果要自定义该错误消息, override it on the form 使用 'unique' 键入 Meta.error_messages['username'] 或者,如果有自定义表单域用于 'username' ,使用 'unique' 其关键 error_messages 参数。

  • 街区 usertoolsbase.html 模板 django.contrib.admin 现在需要 has_permission 要设置的上下文变量。如果您有任何使用此模板的自定义管理视图,请更新它们以通过 AdminSite.has_permission() 作为这个新变量的值或简单地包括 AdminSite.each_context(request) 在上下文中。

  • ClearableFileInput 小部件允许更多的定制。无证件者 url_markup_template 属性被删除,以支持 template_with_initial .

  • 为了与其他主要供应商保持一致,请 en_GB 区域设置现在将星期一作为一周的第一天。

  • 秒已从任何包含它们的区域中删除 TIME_FORMATDATETIME_FORMATSHORT_DATETIME_FORMAT .

  • Oracle测试表空间的默认最大大小已从300米(或200米,在1.7.2之前)增加到500米。

  • reverse()reverse_lazy() 现在返回unicode字符串而不是bytestrings。

  • 这个 CacheClass 填充程序已从所有缓存后端删除。这些别名是为了与Django1.3向后兼容而提供的。如果您仍在使用它们,请更新您的项目以使用在 BACKEND 钥匙 CACHES 设置。

  • 默认情况下, call_command() 现在总是跳过检查框架(除非您通过它 skip_checks=False

  • 遍历行时, File 现在使用 universal newlines . 以下是行尾:unix行尾约定 '\n' ,Windows惯例 '\r\n' 和旧的Macintosh惯例 '\r' .

  • memcached缓存后端 MemcachedCachePyLibMCCache 将删除一个密钥,如果 set() 失败。这是确保 cache_db 会话存储总是获取最新的会话数据。

  • 专用API override_template_loadersoverride_with_test_loader 在里面 django.test.utils 被移除。重写 TEMPLATES 具有 override_settings 相反。

  • DEBUGTrue .

  • HttpRequest 现在简化了 repr (例如) <WSGIRequest: GET '/somepath/'> )这不会改变 SafeExceptionReporterFilter 类。

  • 使用的基于类的视图 ModelFormMixin 将提高 ImproperlyConfigured 例外情况是 fieldsform_class 指定了属性。以前, fields 被悄悄地忽略了。

  • 当跟踪重定向时,测试客户端现在引发 RedirectCycleError 如果检测到循环或达到最大重定向限制(而不是静默传递)。

  • 可翻译字符串设置为 default 字段的参数稍后被强制转换为具体字符串,因此 Field.get_default() 在某些情况下是不同的。不更改可调用结果的默认值。

  • GenericIPAddressField.empty_strings_allowed 现在是 False . 将空字符串解释为空字符串的数据库后端(Django包含的后端中只有Oracle)将不再将空值转换回空字符串。这与其他后端是一致的。

  • BaseCommand.leave_locale_alone 属性是 False ,翻译现在被停用,而不是强制使用“en-us”区域设置。如果您的模型包含非英语字符串,并且您指望在管理命令中激活英语翻译,那么这种情况将不再发生。可能是在迁移到1.8之后生成了新的数据库迁移(一次)。

  • django.utils.translation.get_language() 现在回报 None 而不是 LANGUAGE_CODE 当翻译被暂时停用时。

  • 当特定文本的翻译不存在时,回退现在从 LANGUAGE_CODE 语言(而不是未翻译的 msgid 消息)。

  • 这个 name 领域 django.contrib.contenttypes.models.ContentType 已被迁移删除并替换为属性。这意味着不可能查询或筛选 ContentType 在这个领域里。

    如果升级到django 1.8并跳过django 1.7,请小心。如果你运行 manage.py migrate --fake, this migration will be skipped and you'll see a RuntimeError: Error creating new content types. 例外是因为 name 不会从数据库中删除列。使用 manage.py migrate --fake-initial 只伪造初始迁移。

  • 新的 migrate --fake-initial 选项允许伪造初始迁移。在1.7中,如果在初始迁移中创建的所有表都已存在,则初始迁移始终是自动伪造的。

  • 一个应用程序 没有 带有 ForeignKey 应用程序 with 迁移现在可能会在迁移数据库或运行测试时导致外键约束错误。在Django1.7中,这可能会无声地失败并导致缺少约束。要解决此错误,请将迁移添加到不带迁移的应用程序。

1.8中不推荐的功能

中的选定方法 django.db.models.options.Options

作为 Model._meta API(来自 django.db.models.options.Options 类),许多方法已被弃用,将在django 1.10中删除:

  • get_all_field_names()

  • get_all_related_objects()

  • get_all_related_objects_with_model()

  • get_all_related_many_to_many_objects()

  • get_all_related_m2m_objects_with_model()

  • get_concrete_fields_with_model()

  • get_field_by_name()

  • get_fields_with_model()

  • get_m2m_with_model()

加载 cyclefirstof 模板标记来自 future 类库

Django 1.6介绍 {{% load cycle from future %}}{{% load firstof from future %}} 向前兼容的语法 cyclefirstof 模板标签。此语法现在已弃用,将在Django 1.10中删除。您可以简单地删除 {{% load ... from future %}} 标签。

django.conf.urls.patterns()

在 Django 的旧时代,人们鼓励在 urlpatterns ::

urlpatterns = patterns(
    "",
    url("^$", "myapp.views.myview"),
)

Django会神奇地导入 myapp.views.myview 在内部将字符串转换为真正的函数引用。为了减少引用同一模块中的多个视图时的重复,请 patterns() 函数需要一个必需的首字母 prefix 在该集合中作为字符串附加到所有视图的参数 urlpatterns ::

urlpatterns = patterns(
    "myapp.views",
    url("^$", "myview"),
    url("^other/$", "otherview"),
)

在现代,我们更新了教程,建议您导入视图模块并直接引用视图函数(或类)。这有许多优点,所有这些都源于我们使用普通的python来代替“django字符串魔术”:错误地键入视图名称时的错误不那么模糊,IDE可以帮助自动完成视图名称等。

所以这些天,上述的使用 prefix arg更可能被写(并且写得更好)为:

from myapp import views

urlpatterns = patterns(
    "",
    url("^$", views.myview),
    url("^other/$", views.otherview),
)

因此 patterns() 在教新用户时,这是一个小目的,也是一个负担(回答新用户的问题“为什么我需要这个空字符串作为第一个参数 patterns() “?”因为这些原因,我们正在贬低它。更新代码和确保 urlpatterns 是一个列表 django.conf.urls.url() 实例。例如::

from django.conf.urls import url
from myapp import views

urlpatterns = [
    url("^$", views.myview),
    url("^other/$", views.otherview),
]

将字符串作为 viewdjango.conf.urls.url()

与上一项相关,将视图作为字符串引用到 url() 函数已弃用。如前一节所述,传递可调用视图。

django.core.context_processors

内置模板上下文处理器已移动到 django.template.context_processors .

django.test.SimpleTestCase.urls

属性 SimpleTestCase.urls 对于在测试中指定urlconf配置,已弃用,将在django 1.10中删除。使用 @override_settings(ROOT_URLCONF=...) 相反。

prefix argument to i18n_patterns()

与上一项相关的 prefix 参数 django.conf.urls.i18n.i18n_patterns() 已弃用。只需传递 django.conf.urls.url() 而是实例。

for 模板标签

在中使用不正确的未解包值计数 for 在django 1.10中,标记将引发异常而不是静默失败。

通过一条虚线 reverse()url

通过python路径反转URL是一个代价高昂的操作,因为它会导致反向路径被导入。此行为还导致 security issue . 使用 named URL patterns 换成倒车。

如果您正在使用 django.contrib.sitemaps ,添加 name 论据 url 参考文献 django.contrib.sitemaps.views.sitemap() ::

from django.contrib.sitemaps.views import sitemap

url(
    r"^sitemap\.xml$",
    sitemap,
    {"sitemaps": sitemaps},
    name="django.contrib.sitemaps.views.sitemap",
)

为了确保在Django1.10中删除按python路径反转时的兼容性。

同样,对于地理信息系统站点地图,添加 name='django.contrib.gis.sitemaps.views.kml'name='django.contrib.gis.sitemaps.views.kmz' .

如果您使用的是 LOGIN_URLLOGIN_REDIRECT_URL 设置,使用 url() 相反。

聚合方法和模块

这个 django.db.models.sql.aggregatesdjango.contrib.gis.db.models.sql.aggregates 模块(都是私有API)已弃用为 django.db.models.aggregatesdjango.contrib.gis.db.models.aggregates 现在还负责生成SQL。旧模块将在Django 1.10中移除。

如果您使用的是旧模块,请参见 Query Expressions 有关使用新的稳定API重写自定义聚合的说明。

以下方法和特性 django.db.models.sql.query.Query 也已弃用,将在Django 1.10中移除向后兼容性垫片:

  • Query.aggregates 代替 annotations .

  • Query.aggregate_select 代替 annotation_select .

  • Query.add_aggregate() 代替 add_annotation() .

  • Query.set_aggregate_mask() 代替 set_annotation_mask() .

  • Query.append_aggregate_mask() 代替 append_annotation_mask() .

通过扩展管理命令参数 Command.option_list

管理命令现在使用 argparse 而不是 optparse 解析传递给命令的命令行参数。这还意味着向命令添加自定义参数的方式已经改变:而不是扩展 option_list 类列表,现在应该重写 add_arguments() 方法并通过添加参数 argparse.add_argument() . 见 this example 了解更多详细信息。

django.core.management.NoArgsCommand

NoArgsCommand 现已弃用,将在Django 1.10中删除。使用 BaseCommand 相反,默认情况下不接受参数。

列出项目中的所有迁移

这个 --list 选择权 migrate 管理命令已弃用,将在Django 1.10中删除。使用 showmigrations 相反。

cache_choices option of ModelChoiceField and ModelMultipleChoiceField

ModelChoiceFieldModelMultipleChoiceField 选择了一个未经记录、未经测试的选项 cache_choices . 在相同的多个呈现之间缓存的查询集 Form 对象。此选项将加速折旧,并将在Django 1.9中删除。

django.template.resolve_variable()

函数已经非正式地标记为“deprecated”一段时间了。替换 resolve_variable(path, context) 具有 django.template.Variable(path).resolve(context) .

django.contrib.webdesign

它提供了 lorem 现在包含在内置标记中的模板标记。简单去除 'django.contrib.webdesign'INSTALLED_APPS{{% load webdesign %}} 从你的模板。

error_message argument to django.forms.RegexField

它为1.0之前的代码提供了向后兼容性,但它的功能是多余的。使用 Field.error_messages['invalid'] 相反。

旧的 unordered_list 句法

较旧的(1.0之前的版本),更严格和详细的输入格式 unordered_list 模板筛选器已弃用::

["States", [["Kansas", [["Lawrence", []], ["Topeka", []]]], ["Illinois", []]]]

使用新的语法,这变为:

["States", ["Kansas", ["Lawrence", "Topeka"], "Illinois"]]

django.forms.Field._has_changed()

将此方法重命名为 has_changed() 删除前导下划线。老名字在 Django 1.10之前仍然有效。

django.utils.html.remove_tags()removetags 模板滤波器

django.utils.html.remove_tags() 以及模板过滤器 removetags 已弃用,因为它们无法保证安全输出。它们的存在可能导致它们在安全敏感的环境中使用,而这些环境实际上并不安全。

未使用和未记录的 django.utils.html.strip_entities() 函数也已弃用。

is_admin_site argument to django.contrib.auth.views.password_reset()

这是一个不再需要的传统选择。

SubfieldBase

django.db.models.fields.subclassing.SubfieldBase 已弃用,将在Django 1.10中删除。历史上,它用于处理从数据库加载时需要类型转换的字段,但在 .values() 调用或聚合。它已被替换为 from_db_value() .

新的方法不称为 to_python() 分配方法与 SubfieldBase . 如果您需要这种行为,请重新实现 Creatorfrom Django's source code 在你的项目中。

django.utils.checksums

这个 django.utils.checksums 模块已弃用,将在Django 1.10中删除。它提供的功能(使用Luhn算法验证校验和)没有文档记录,也没有在Django中使用。该模块已移动到 django-localflavor 程序包(1.1+版)。

InlineAdminForm.original_content_type_id

这个 original_content_type_id 属性对 InlineAdminForm 已弃用,将在Django 1.10中删除。历史上,它被用来构建“现场查看”的URL。现在可以使用 absolute_url 窗体的属性。

django.views.generic.edit.FormMixin.get_form()form_class 论点

FormMixin 重写 get_form() 方法应确保为 form_class 因为它现在是可选的。

呈现由加载的模板 get_template() 用一个 Context

返回类型 get_template() 已在Django 1.8中更改:而不是 django.template.Template 它返回一个 Template 其确切类型取决于加载它的后端的实例。

这两个类都提供了 render() 但是,前者需要 django.template.Context 作为一个论点,后者期望 dict . 此更改通过Django模板的取消预测路径强制执行。

所有这些也适用于 select_template() .

TemplateContext 模板响应中的类

几种方法 SimpleTemplateResponseTemplateResponse 认可的 django.template.Contextdjango.template.Template 对象作为参数。他们现在应该得到 dict 和后端依赖模板对象。

这也适用于返回类型,如果您已经对模板响应类进行了子类化。

检查 template response API documentation 有关详细信息。

dictionarycontext_instance 呈现函数的参数

以下功能将不再接受 dictionarycontext_instance Django 1.10中的参数:

  • django.shortcuts.render()

  • django.shortcuts.render_to_response()

  • django.template.loader.render_to_string()

使用 context 改为参数。什么时候? dictionary 作为位置参数传递,这是最常见的习惯用法,不需要更改。

如果你通过 Context 在里面 context_instance 通过一个 dictcontext 改为参数。如果你通过 RequestContext ,分别在 request 参数。

dirs 模板查找函数的参数

以下函数将不再接受 dirs 要重写的参数 TEMPLATE_DIRS 在Django 1.10:

该参数在不同的模板加载器中工作不一致,也不适用于包含的模板。

django.template.loader.BaseLoader

django.template.loader.BaseLoader 重命名为 django.template.loaders.base.Loader . 如果您已经编写了一个继承 BaseLoader ,您必须继承 Loader 相反。

django.test.utils.TestTemplateLoader

私有API django.test.utils.TestTemplateLoader 被否决,赞成 django.template.loaders.locmem.Loader 将在Django 1.9中移除。

支持 max_length 自定义参数 Storage

Storage 子类应添加 max_length=None 作为参数 get_available_name() 和/或 save() 如果它们重写任何一个方法。对不接受此参数的存储的支持将在Django 1.10中删除。

qn replaced by compiler

在以前的django版本中,各种内部ORM方法(主要是 as_sql 方法)接受 qn (对于“quote name”)参数,它引用了一个函数,该函数引用了发送到数据库的标识符。在Django 1.8中,该参数已重命名为 compiler 现在已经满了 SQLCompiler 实例。为了向后兼容,调用 SQLCompiler 实例执行相同的名称,引用 qn 函数用于。但是,这个向后兼容性填充程序立即被否决:您应该重命名 qn 论据 compiler 和调用 compiler.quote_name_unless_alias(...) 你以前调用的地方 qn(...) .

的默认值 RedirectView.permanent

的默认值 RedirectView.permanent 属性将从更改 TrueFalse 在Django 1.9。

使用 AuthenticationMiddleware 没有 SessionAuthenticationMiddleware

django.contrib.auth.middleware.SessionAuthenticationMiddleware 在Django 1.7中添加。在Django 1.7.2中,其功能被移动到 auth.get_user() 并且,为了向后兼容,只有在 'django.contrib.auth.middleware.SessionAuthenticationMiddleware' 出现在 MIDDLEWARE_CLASSES .

在Django 1.10中,无论是否启用会话验证,都将启用会话验证。 SessionAuthenticationMiddleware 已启用(此时 SessionAuthenticationMiddleware 没有意义)。您可以将其添加到 MIDDLEWARE_CLASSES 在那之前的某个时候选择加入。请阅读 upgrade considerations 第一。

django.contrib.sitemaps.FlatPageSitemap

django.contrib.sitemaps.FlatPageSitemap 已经搬到 django.contrib.flatpages.sitemaps.FlatPageSitemap . 旧的导入位置已弃用,将在Django 1.9中删除。

ssi 模板标签

这个 ssi 模板标记允许文件按绝对路径包含在模板中。在大多数部署情况下,这是有限的,并且 include 标签通常更有意义。此标记现在已弃用,将在Django 1.10中删除。

= 作为比较运算符 if 模板标签

使用一个等号 {{% if %}} 平等性测试的模板标记未记录和未测试。它现在被弃用了,取而代之的是 == .

%(<foo>)s syntax in ModelFormMixin.success_url

遗产 %(<foo>)s 语法在 ModelFormMixin.success_url 已弃用,将在Django 1.10中删除。

GeoQuerySet 聚合方法

这个 collect()extent()extent3d()make_line()unionagg() 不推荐使用聚合方法,应将其替换为基于函数的聚合等效方法 (CollectExtentExtent3DMakeLineUnion

签字 allow_migrate 路由方法

签名 allow_migrate() 数据库路由器的方法已从更改为 allow_migrate(db, model)allow_migrate(db, app_label, model_name=None, **hints) .

什么时候? model_name 设置,以前通过 model 位置参数现在可以在 hints 关键字下的词典 'model' .

切换到新签名后,路由器也将被 RunPythonRunSQL 操作。

1.8中删除的功能

这些功能已达到其折旧周期的末尾,并在Django 1.8中删除。见 1.6中不推荐的功能 有关详细信息,包括如何删除这些功能的用法。

  • django.contrib.comments 被移除。

  • 将删除以下事务管理API:

    • TransactionMiddleware

    • 装饰师和上下文管理器 autocommitcommit_on_successcommit_manually ,定义在 django.db.transaction

    • 功能 commit_unless_managedrollback_unless_managed ,也在中定义 django.db.transaction

    • 这个 TRANSACTIONS_MANAGED 设置

  • 这个 cyclefirstof 模板标记自动转义它们的参数。

  • 这个 SEND_BROKEN_LINK_EMAILS 设置被删除。

  • django.middleware.doc.XViewMiddleware 被移除。

  • 这个 Model._meta.module_name 别名已删除。

  • 引入向后兼容垫片以重命名 get_query_set 删除了类似的查询集方法。这将影响以下类: BaseModelAdminChangeListBaseCommentNodeGenericForeignKeyManagerSingleRelatedObjectDescriptorReverseSingleRelatedObjectDescriptor .

  • 引入向后兼容垫片来重命名属性 ChangeList.root_query_setChangeList.query_set 被移除。

  • django.views.defaults.shortcutdjango.conf.urls.shortcut 被移除。

  • 对python图像库(pil)模块的支持被删除。

  • 将删除以下私有API:

    • django.db.backend

    • django.db.close_connection()

    • django.db.backends.creation.BaseDatabaseCreation.set_autocommit()

    • django.db.transaction.is_managed()

    • django.db.transaction.managed()

  • django.forms.widgets.RadioInput 被移除。

  • 模块 django.test.simple 和类 django.test.simple.DjangoTestSuiteRunner 被移除。

  • 模块 django.test._doctest 被移除。

  • 这个 CACHE_MIDDLEWARE_ANONYMOUS_ONLY 设置被删除。这一变化同时影响 django.middleware.cache.CacheMiddlewaredjango.middleware.cache.UpdateCacheMiddleware 尽管在后一类中没有弃用警告。

  • 硬编码的用法 按住Mac上的“Control”(控制)或“Command”(命令),选择多个。 重写或附加到用户提供的字符串 help_text 在表格中 ManyToMany 模型字段不再由Django在模型或窗体层执行。

  • 这个 Model._meta.get_(add|change|delete)_permission 方法被删除。

  • 会话密钥 django_language 不再读取以获得向后兼容性。

  • 删除地理位置图 (django.contrib.gis.sitemaps.views.indexdjango.contrib.gis.sitemaps.views.sitemap

  • django.utils.html.fix_ampersands , the fix_ampersands 模板过滤器,以及 django.utils.html.clean_html 被移除。