Django 1.8 发行说明 — Django 文档
Django 1.8 发行说明
2015 年 4 月 1 日
欢迎使用 Django 1.8!
这些发行说明涵盖了 新功能 ,以及从 Django 1.7 或更旧版本升级时您需要注意的一些 向后不兼容更改 。 我们还 开始了一些功能的弃用过程 ,并且一些功能已经达到了弃用过程的结束,并且 已被删除 。
如果您要更新现有项目,请参阅 将 Django 升级到更新版本 指南。
Django 1.8 已被指定为 Django 的第二个 长期支持版本 。 它将在发布后至少三年内收到安全更新。 对之前的 LTS Django 1.4 的支持将在 Django 1.8 发布之日起 6 个月后结束。
Python兼容性
Django 1.8 需要 Python 2.7、3.2、3.3、3.4 或 3.5。 我们【X3X】强烈推荐【X23X】,官方只支持各系列的最新版本。
Django 1.8 是第一个支持 Python 3.5 的版本。
由于上游对 Python 3.2 的支持在 2016 年 2 月结束,我们不会在 2016 年年底之后在 Python 3.2 上测试 Django 1.8.x。
Django 1.8 中的新功能
Model._meta API
Django 现在有 Model._meta 的正式 API,提供官方支持的方式来 检索字段 并根据字段 属性 过滤字段。
Model._meta
对象从 0.96 之前的“Magic Removal”时代起就一直是 Django 的一部分——它只是不是一个正式的、稳定的 API。 认识到这一点,我们努力在可能的情况下保持与旧 API 端点的向后兼容性。 但是,不属于新官方 API 的 API 端点已被弃用,最终将被删除。
多个模板引擎
Django 1.8 定义了一个用于集成模板后端的稳定 API。 它包括对 Django 模板语言和 Jinja2 的内置支持。 它支持在同一项目中具有多个引擎的渲染模板。 在 主题指南 中了解有关新功能的更多信息,并查看旧版本文档中的升级说明。
安全增强
django-secure 第三方库的几个特性已经集成到 Django 中。 django.middleware.security.SecurityMiddleware 为请求/响应周期提供了多项安全增强功能。 新的 check --deploy
选项允许您检查生产设置文件以了解提高站点安全性的方法。
新的 PostgreSQL 特定功能
Django 现在有一个包含 PostgreSQL 特定功能扩展的模块,例如 ArrayField、HStoreField、Range Fields 和 :lookup:`unaccent`[ X174X] 查找。 文档中提供了功能的完整细分。
新数据类型
- Django 现在有一个 UUIDField 用于存储通用唯一标识符。 它在 PostgreSQL 上存储为本机
uuid
数据类型,在其他后端存储为固定长度的字符字段。 有一个对应的 表单域 。 - Django 现在有一个 DurationField 用于存储时间段 - 由
timedelta
在 Python 中建模。 它存储在 PostgreSQL 上的本机interval
数据类型中,在 Oracle 上存储为INTERVAL DAY(9) TO SECOND(6)
,在其他后端存储为微秒的bigint
。 所有后端的日期和时间相关算法也得到了改进。 有一个对应的 表单域 。
查询表达式、条件表达式和数据库函数
查询表达式 允许您创建、自定义和组合复杂的 SQL 表达式。 这使得 annotate 能够接受聚合以外的表达式。 聚合现在能够引用多个字段,以及执行算术运算,类似于 F()
对象。 order_by() 也获得了接受表达式的能力。
条件表达式 允许您在查询中使用 if
... elif
... else
逻辑。
数据库函数 的集合还包括 Coalesce、Concat 和 Substr 等功能。
TestCase 数据设置
TestCase 已被重构以允许使用事务和保存点在类级别进行数据初始化。 不支持事务的数据库后端,如带有 MyISAM 存储引擎的 MySQL,仍将能够运行这些测试,但不会从改进中受益。 测试现在在两个嵌套的 atomic() 块中运行:一个用于整个类,一个用于每个测试。
- 类方法 TestCase.setUpTestData() 添加了在类级别设置测试数据的能力。 与使用
setUp()
相比,使用此技术可以加快测试速度。 TestCase
内的夹具加载现在对整个TestCase
执行一次。
小功能
django.contrib.admin
- ModelAdmin 现在有一个 has_module_permission() 方法来允许限制对管理索引页面上的模块的访问。
- InlineModelAdmin 现在有一个属性 show_change_link,它支持显示指向内联对象更改表单的链接。
- 使用 ModelAdmin.list_filter 中的新
django.contrib.admin.RelatedOnlyFieldListFilter
将list_filter
选择限制为附加到来自ModelAdmin
的异物。 - ModelAdmin.delete_view() 在删除确认页面上显示要删除的对象的摘要。
- 嵌入在 admin 中的 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。
django.contrib.auth
- 授权后端现在可以在 has_perm() 和 has_module_perms() 中提高 PermissionDenied 以短路权限检查。
- PasswordResetForm 现在有一个方法 send_mail() 可以重写以自定义要发送的邮件。
- Permission.name 的
max_length
从 50 个字符增加到 255 个字符。 请运行数据库迁移。 - USERNAME_FIELD 和 REQUIRED_FIELDS 现在支持 ForeignKey。
- PBKDF2 密码哈希器的默认迭代计数增加了 33%。 这种向后兼容的更改不会影响子类化
django.contrib.auth.hashers.PBKDF2PasswordHasher
的用户更改默认值。
django.contrib.gis
- 一个新的 GeoJSON 序列化器 现在可用。
- 现在允许包含子查询作为地理查找参数,例如
City.objects.filter(point__within=Country.objects.filter(continent='Africa').values('mpoly'))
。 - 当数据库版本为 3.0 或更高版本时,SpatiaLite 后端现在支持 [X36X] 和
Extent
聚合。 - PostGIS 2
CREATE EXTENSION postgis
和 SpatiaLiteSELECT InitSpatialMetaData
初始化命令现在由 :djadmin:`migrate` 自动运行。 - GDAL 接口现在支持检索 光栅(图像)数据文件 的属性。
- 在 Django 1.2 中更改的
SpatialRefSys
和GeometryColumns
的兼容性垫片已被删除。 - 现在所有与 GDAL 相关的异常都由
GDALException
引发。 以前的OGRException
已保留以向后兼容,但不应再使用。
django.contrib.sites
- get_current_site() 现在将根据 request.get_host() 查找当前站点,如果 :setting:`SITE_ID` 设置未定义。
- 运行
migrate
时创建的默认 Site 现在遵循 :setting:`SITE_ID` 设置(而不是总是使用pk=1
)。
缓存
django.core.cache.backends.locmem.LocMemCache
后端的incr()
方法现在是线程安全的。
数据库后端
- MySQL 后端不再从
datetime
值中剥离微秒,因为 MySQL 5.6.4 及更高版本支持小数秒,具体取决于日期时间字段的声明(当DATETIME
包括小数精度大于 0 时)。 使用 Django 1.8 和 MySQL 5.6.4 及更高版本创建的新日期时间数据库列将支持微秒。 有关更多详细信息,请参阅 MySQL 数据库说明 。 - 使用 InnoDB 存储引擎时,MySQL 后端不再为外键创建显式索引,因为 MySQL 已经自动创建了它们。
- Oracle 后端不再将
connection_persists_old_columns
特性定义为True
。 相反,Oracle 现在将在获取表的描述时包含一个缓存破坏子句。
电子邮件
- 电子邮件后端 现在支持用于打开和关闭连接的上下文管理器协议。
- SMTP 电子邮件后端现在通过 :setting:`EMAIL_SSL_CERTFILE` 和 :setting:`EMAIL_SSL_KEYFILE` 设置支持 [X36X] 和
certfile
身份验证。 - SMTP EmailBackend 现在支持使用 :setting:`EMAIL_TIMEOUT` 设置来设置
timeout
参数。 - EmailMessage 和
EmailMultiAlternatives
现在支持reply_to
参数。
文件存储
- Storage.get_available_name() 和 Storage.save() 现在采用
max_length
参数来实现存储级最大文件名长度约束。 超过此参数的文件名将被截断。 这可以防止在将唯一后缀附加到存储上已存在的长文件名时出现数据库错误。 请参阅 弃用说明 ,了解将此参数添加到您的自定义存储类。
表格
- 表单小部件现在将值为
True
或False
的属性渲染为 HTML5 布尔属性。 - 新的 has_error() 方法允许检查是否发生了特定错误。
- 如果在表单上定义了 required_css_class,则必填字段的
<label>
标签将在其属性中包含此类。 - 无序列表 (
<ul>
) 中非字段错误的呈现现在在其类列表中包含nonfield
,以将它们与特定于字段的错误区分开来。 - Field 现在接受 label_suffix 参数,它将覆盖表单的 label_suffix。 这允许在每个字段的基础上自定义后缀 - 以前在模板中使用
模板:Form.as p
等快捷方式时无法覆盖表单的 label_suffix。 - SelectDateWidget 现在接受 empty_label 参数,当不需要 DateField 时,它将覆盖顶部列表选项标签。
- ImageField 被清理和验证后,
UploadedFile
对象将有一个额外的image
属性,其中包含用于检查文件的 PillowImage
实例是一个有效的图像。 它还将使用 Pillow 确定的图像内容类型更新UploadedFile.content_type
。 - 您现在可以传递一个在实例化 ChoiceField 时返回可迭代选择的可调用对象。
通用视图
- 使用 MultipleObjectMixin 的通用视图现在可以通过设置 ordering 或覆盖 get_ordering() 来指定应用于 queryset 的排序。
- 新的 SingleObjectMixin.query_pk_and_slug 属性允许更改 get_object() 的行为,以便它使用主键和 slug 执行查找。
- get_form() 方法不再需要提供
form_class
。 如果未提供form_class
默认为 get_form_class()。 - ModelFormMixin.success_url 中的占位符现在支持 Python
str.format()
语法。 仍然支持旧的%(<foo>)s
语法,但将在 Django 1.10 中删除。
国际化
- :setting:`FORMAT_MODULE_PATH` 现在可以是表示模块路径的字符串列表。 这允许从不同的可重用应用程序导入多个格式模块。 它还允许在您的主要 Django 项目中覆盖这些自定义格式。
管理命令
- 在从命令行调用的管理命令完成其工作后,数据库连接现在总是关闭。
- 现在还发现了来自其他包格式(如鸡蛋)的命令。
- 新的
dumpdata --output
选项允许指定写入序列化数据的文件。 - 新的
makemessages --exclude
和compilemessages --exclude
选项允许从处理中排除特定的语言环境。 - :djadmin:`compilemessages` 现在有一个
--use-fuzzy
或-f
选项,其中包括对编译文件的模糊翻译。 loaddata --ignorenonexistent
选项现在会忽略不再存在的模型的数据。- :djadmin:`runserver` 现在使用守护线程来更快地重新加载。
- :djadmin:`inspectdb` 现在输出
Meta.unique_together
。 它还能够内省 MySQL 和 PostgreSQL 数据库的 AutoField。 - 当使用 call_command() 调用带有选项的管理命令时,选项名称可以匹配命令行选项名称(没有初始破折号)或最终选项目标变量名称,但在任何一种情况下,结果选项都收到由命令现在总是在命令选项定义中指定的
dest
名称(只要命令使用argparse
模块)。 - :djadmin:`dbshell` 命令现在支持 MySQL 的可选 SSL 证书颁发机构设置 (
--ssl-ca
)。 - 新的
makemigrations --name
允许为迁移提供自定义名称而不是生成的名称。 - :djadmin:`loaddata` 命令现在可以防止重复加载装置。 如果 :setting:`FIXTURE_DIRS` 包含重复项或默认夹具目录路径 (
app_name/fixtures
),则会引发异常。 - 如果没有创建迁移,新的
makemigrations --exit
选项允许以错误代码退出。 - 新的 :djadmin:`showmigrations` 命令允许列出项目中的所有迁移及其依赖项。
中间件
- CommonMiddleware.response_redirect_class 属性允许您自定义中间件发出的重定向。
- 当中间件在 :setting:`DEBUG` 模式下引发 MiddlewareNotUsed 异常时,调试消息将记录到
django.request
记录器。
迁移
- RunSQL 操作现在可以处理传递给 SQL 语句的参数。
- 现在可以为没有模型的应用程序进行迁移(很可能 数据迁移 )。
- 迁移现在可以 序列化模型管理器 作为模型状态的一部分。
- 添加了一个 通用机制来处理模型字段 的弃用。
- 添加了 RunPython.noop() 和 RunSQL.noop 类方法/属性,以便于使
RunPython
和RunSQL
操作可逆。 - 迁移操作 RunPython 和 RunSQL 现在调用数据库路由器的 allow_migrate() 方法。 路由器可以使用新引入的
app_label
和hints
参数来做出路由决定。 要利用此功能,您需要将路由器更新为新的allow_migrate
签名,有关详细信息,请参阅 弃用部分 。
型号
- Django 现在在
connections.queries
中最多记录 9000 个查询,以防止在调试模式下长时间运行的进程中过度使用内存。 - 现在有一个模型
Meta
选项可以为模型的所有关系字段定义 默认相关名称 。 - 不正式支持跨不同版本的 Django 酸洗模型和查询集(它可能有效,但不能保证)。 一个指定当前 Django 版本的额外变量现在被添加到模型和查询集的腌制状态,当这些对象在与它们被腌制的版本不同的版本中被取消腌制时,Django 会引发
RuntimeWarning
。 - 添加了 Model.from_db(),每当使用 ORM 加载对象时,Django 都会使用它。 该方法允许自定义模型加载行为。
extra(select={...})
现在允许您使用%%s
转义文字%s
序列。- 自定义查找 现在可以使用装饰器模式注册。
- 新的 Transform.bilateral 属性允许创建双边转换。 当在查找表达式中使用时,这些转换适用于
lhs
和rhs
,为更复杂的查找提供机会。 - SQL 特殊字符 (, %, _) 现在在模式查找(例如
contains
、startswith
等)与右侧的F()
表达式一起使用。 在这些情况下,转义由数据库执行,这可能会导致涉及嵌套REPLACE
函数调用的复杂查询。 - 您现在可以使用 Model.refresh_from_db() 刷新模型实例。
- 您现在可以使用 Model.get_deferred_fields() 获取模型的延迟字段集。
- 当主键字段设置为
None
时,现在使用模型字段default
。
信号
- Signal.send_robust() 返回的
(receiver, exception)
元组的异常现在将其回溯附加为__traceback__
属性。 environ
参数包含来自请求的 WSGI 环境结构,已添加到 request_started 信号中。- 您现在可以从
django.core.signals
导入 setting_changed() 信号以避免在非测试情况下加载django.test
。 Django 本身不再这样做。
模板
- :tfilter:`urlize` 现在支持在顶级域之后包含字符的仅限域的链接(例如
djangoproject.com/
和djangoproject.com/download/
)。 - :tfilter:`urlize` 不会将域末尾的感叹号或其查询字符串视为 URL 的一部分(例如
'djangoproject.com!
是djangoproject.com
) - 添加了一个 locmem.Loader 类,用于从 Python 字典加载 Django 模板。
- :ttag:`now` 标签现在可以使用通常的语法将其输出存储在上下文变量中:
{% now 'j n Y' as varname %}
。
请求和响应
WSGIRequest
现在尊重以//
开头的路径。- HttpRequest.build_absolute_uri() 方法现在可以正确处理以
//
开头的路径。 - 如果 :setting:`DEBUG` 是
True
并且请求引发 SuspiciousOperation,则响应将呈现详细的错误页面。 - QueryDict 的
query_string
参数现在是可选的,默认为None
,所以现在可以用QueryDict()
实例化一个空白的QueryDict
QueryDict(None)
或QueryDict()
。 - HttpRequest 对象的
GET
和POST
属性现在是 QueryDict 而不是字典,FILES
属性现在是MultiValueDict
。 这使此类符合文档和WSGIRequest
。 - 添加了 HttpResponse.charset 属性。
WSGIRequestHandler
现在遵循 RFC 将 URI 转换为 IRI,使用uri_to_iri()
。- HttpRequest.get_full_path() 方法现在可以正确地从统一资源标识符 (URI) 的路径部分转义不安全字符。
- HttpResponse 现在实现了一些额外的方法,如 getvalue() 以便实例可以用作流对象。
- 新的 HttpResponse.setdefault() 方法允许设置标头,除非它已经设置。
- 您可以使用新的 FileResponse 来流式传输文件。
- 用于条件视图处理的 condition() 装饰器现在支持
If-unmodified-since
标头。
测试
- 实现了 RequestFactory.trace() 和 Client.trace() 方法,允许您在测试中创建
TRACE
请求。 count
参数被添加到 assertTemplateUsed()。 这允许您断言模板已呈现特定次数。- 新的 assertJSONNotEqual() 断言允许您测试两个 JSON 片段是否不相等。
- 向 :djadmin:`test` 命令添加选项以保留测试数据库 (
--keepdb
),以相反的顺序运行测试用例 (--reverse
),以及为失败的测试启用 SQL 日志记录 (--debug-sql
)。 - 添加了 resolver_match 属性来测试客户端响应。
- 添加了几个允许为 Oracle 自定义测试表空间参数的设置::setting:`DATAFILE`, :setting:`DATAFILE_TMP`, :setting:`DATAFILE_MAXSIZE` ] 和 :设置:`DATAFILE_TMP_MAXSIZE`。
- override_settings() 装饰器现在可以影响 :setting:`DATABASE_ROUTERS` 中的主路由器。
- 添加了对带有类文件对象的文件上传的测试客户端支持。
- 当使用 Python 3.4+ 和 SQLite 3.7.13+ 时,现在在使用 SQLite 内存数据库进行测试时使用共享缓存。 这允许在线程之间共享数据库。
1.8 中向后不兼容的变化
将未保存的对象分配给关系会引发错误
笔记
为了更轻松地允许在内存中使用模型,此更改在 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 中删除了对反转一对一关系的赋值的类似检查。
将未保存的对象分配给 ForeignKey、GenericForeignKey 和 OneToOneField 现在会引发 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: ...
的错误,因为变量解析现在基于 [ X217X] 不隐式接受位置参数。 您可以通过简单地设置 args
类变量来使您的命令向后兼容。 但是,如果您不必保持与旧 Django 版本的兼容性,最好实现新的 add_arguments() 方法,如 编写自定义 django-admin 命令 中所述。
通过测试运行器自定义测试管理命令参数
通过测试运行程序向 test
管理命令添加自定义参数的方法已更改。 以前,您可以在测试运行器上提供 option_list
类变量以添加更多参数(如 optparse
)。 现在要实现相同的行为,您必须在测试运行器上创建一个 add_arguments(cls, parser)
类方法并调用 parser.add_argument
来添加任何自定义参数,因为解析器现在是一个 argparse.ArgumentParser
实例.
模型检查确保自动生成的列名在数据库指定的限制内
比数据库支持的列名长度长的字段名可能会产生问题。 例如,对于 MySQL,您将在尝试创建列时遇到异常,而对于 PostgreSQL,列名会被数据库截断(您可能会在 PostgreSQL 日志中看到警告)。
引入了模型检查,以便在实际创建数据库表之前更好地提醒用户注意这种情况。
如果您有一个现有模型,该检查似乎是误报,例如在名称已被截断的 PostgreSQL 上,只需使用 db_column 指定正在使用的名称。
该检查也适用于在隐式 ManyToManyField.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 月结束。 因此,Django 1.8 将 9.0 设置为它正式支持的最低 PostgreSQL 版本。
这还包括放弃对 PostGIS 1.3 和 1.4 的支持,因为 8.4 之后的 PostgreSQL 版本不支持这些版本。
Django 现在还需要使用 Psycopg2 2.4.5 或更高版本(如果你想使用 django.contrib.postgres,则需要 2.5+)。
支持早于 5.5 的 MySQL 版本
MySQL 5.0 的上游支持期结束于 2012 年 1 月,MySQL 5.1 的上游支持期结束于 2013 年 12 月。 因此,Django 1.8 将 5.5 设置为它正式支持的最低 MySQL 版本。
支持早于 11.1 的 Oracle 版本
Oracle 9.2 于 2010 年 7 月、Oracle 10.1 于 2012 年 1 月和 Oracle 10.2 于 2013 年 7 月结束了上游支持期。 因此,Django 1.8 将 11.1 设置为它正式支持的最低 Oracle 版本。
用于 Oracle 测试的特定特权而不是角色
早期版本的 Django 将 CONNECT 和 RESOURCE 角色授予 Oracle 上的测试用户。 这些角色已被弃用,因此 Django 1.8 改为使用特定的底层权限。 这会更改主用户运行测试所需的权限(除非将项目配置为避免创建测试用户)。 现在所需的确切权限在 Oracle 说明 中有详细说明。
AbstractUser.last_login 允许空值
AbstractUser.last_login 字段现在允许空值。 以前,它默认为创建用户的时间,如果用户从未登录,则会产生误导。 如果您使用默认用户 (django.contrib.auth.models.User),请运行 contrib.auth
中包含的数据库迁移。
如果您使用继承自 AbstractUser
的自定义用户模型,则需要运行 :djadmin:`makemigrations` 并为包含该模型的应用生成迁移。 此外,如果希望为尚未登录的用户设置 last_login
为 NULL
,您可以运行此查询:
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 的支持。
- 已取消对 SpatiaLite < 2.4 的支持。
- 特定于 GIS 的查找已重构为使用 django.db.models.Lookup API。
- GEOSGeometry 对象的默认
str
表示已从 WKT 更改为 EWKT 格式(包括 SRID)。 由于此表示用于序列化框架,这意味着dumpdata
输出现在将包含几何对象的 SRID 值。
TemplateResponse 上下文处理器的优先级与 render 保持一致
TemplateResponse 构造函数旨在替代 render() 函数。 但是,它有一点不兼容,因为对于 TemplateResponse
,传入的上下文字典中的上下文数据可能会被上下文处理器返回的上下文数据所掩盖,而对于 render
则相反大约。 这是一个错误,render
的行为更合适,因为它允许在视图中本地覆盖全局定义的上下文处理器。 如果您依赖 TemplateResponse
中的事实上下文数据可以使用上下文处理器覆盖,则需要更改代码。
在测试用例中覆盖 setUpClass / tearDownClass
当用作类装饰器时,装饰器 override_settings() 和 modify_settings() 现在在类级别起作用。 因此,当覆盖 setUpClass()
或 tearDownClass()
时,应始终调用 super
实现。
测试之间的数据库连接重新加载
Django 之前关闭了 TestCase
中每个测试之间的数据库连接。 这不再是这种情况,因为 Django 现在将整个 TestCase
包装在一个事务中。 如果您的某些测试依赖于旧行为,您应该让它们从 TransactionTestCase
继承。
django.template 命名空间的清理
如果您一直依赖于 django.template
模块中公开的私有 API,则可能必须改为从 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.RelatedObject
返回,并将 model
属性设置为源的关系。 现在,此方法将关系返回为 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'>
要访问源模型,您可以使用这样的模式来编写适用于 Django 1.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_types
、data_types_suffix
和data_type_check_constraints
属性已从DatabaseCreation
类移至DatabaseWrapper
。SQLCompiler.as_sql()
方法现在采用subquery
参数(:ticket:`24164`)。BaseDatabaseOperations.date_interval_sql()
方法现在只需要一个timedelta
参数。
django.contrib.admin
AdminSite
不再需要app_name
参数,其app_name
属性已被删除。 应用程序名称始终为admin
(与您仍然可以使用AdminSite(name="...")
自定义的实例名称相反。ModelAdmin.get_object()
方法(私有 API)现在采用名为from_field
的第三个参数,以指定哪个字段应与提供的object_id
匹配。- ModelAdmin.response_delete() 方法现在采用名为
obj_id
的第二个参数,它是用于在删除前检索对象的序列化标识符。
django.template.defaultfilters 中函数的默认自动转义
为了使内置模板过滤器在 Python 代码中调用时输出 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 添加尾部斜杠。:tfilter:`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 将继续在params
中提供pk
参数以实现向后兼容性。UserCreationForm.error_messages['duplicate_username']
不再使用。 如果您希望自定义该错误消息,请使用Meta.error_messages['username']
中的'unique'
键 在表单 上覆盖它,或者,如果您有 的自定义表单字段[ X159X],在其 error_messages 参数中使用'unique'
键。django.contrib.admin 的
base.html
模板中的块usertools
现在需要设置has_permission
上下文变量。 如果您有任何使用此模板的自定义管理视图,请更新它们以将 AdminSite.has_permission() 作为此新变量的值传递,或者仅在上下文中包含 AdminSite.each_context(request) .对 ClearableFileInput 小部件进行了内部更改以允许更多自定义。 未记录的
url_markup_template
属性被移除,取而代之的是template_with_initial
。为了与其他主要供应商保持一致,
en_GB
语言环境现在将星期一作为一周的第一天。秒已从在
TIME_FORMAT
、DATETIME_FORMAT
或SHORT_DATETIME_FORMAT
中的任何语言环境中删除。Oracle 测试表空间的默认最大大小已从 300M(或 200M,1.7.2 之前)增加到 500M。
reverse()
和reverse_lazy()
现在返回 Unicode 字符串而不是字节字符串。CacheClass
垫片已从所有缓存后端中删除。 提供这些别名是为了与 Django 1.3 向后兼容。 如果您仍在使用它们,请更新您的项目以使用在 :设置:`后端 ` 的关键 :设置:`缓存` 环境。默认情况下,call_command() 现在总是跳过检查框架(除非你通过它
skip_checks=False
)。遍历行时,File 现在使用 通用换行符 。 以下被认为是行尾:Unix 行尾约定
'\n'
、Windows 约定'\r\n'
和旧的 Macintosh 约定'\r'
。如果
set()
失败,Memcached 缓存后端MemcachedCache
和PyLibMCCache
将删除一个键。 这是确保cache_db
会话存储始终获取最新会话数据所必需的。删除了
django.test.utils
中的私有 APIoverride_template_loaders
和override_with_test_loader
。 用override_settings
替代TEMPLATES
。当 :setting:`DEBUG` 为
True
时,来自 MySQL 数据库后端的警告不再转换为异常。HttpRequest 现在有一个简化的
repr
(例如<WSGIRequest: GET '/somepath/'>
)。 这不会改变 SafeExceptionReporterFilter 类的行为。当指定了
fields
和form_class
属性时,使用 ModelFormMixin 的基于类的视图将引发 ImproperlyConfigured 异常。 以前,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
而不是 :setting:`LANGUAGE_CODE`。当特定文字不存在翻译时,回退现在取自 :setting:`LANGUAGE_CODE` 语言(而不是未翻译的
msgid
消息)。django.contrib.contenttypes.models.ContentType 的
name
字段已被迁移删除并替换为属性。 这意味着无法再通过此字段查询或过滤ContentType
。如果您升级到 Django 1.8 并跳过 Django 1.7,请小心。 如果您运行
manage.py migrate --fake
,此迁移将被跳过,您将看到RuntimeError: Error creating new content types.
异常,因为name
列不会从数据库中删除。 使用manage.py migrate --fake-initial
仅伪造初始迁移。新的
migrate --fake-initial
选项允许伪造初始迁移。 在 1.7 中,如果初始迁移中创建的所有表都已存在,则初始迁移总是会自动伪造。现在,在迁移数据库或运行测试时,没有 的应用程序 迁移和
ForeignKey
迁移到应用程序 和 迁移可能会导致外键约束错误。 在 Django 1.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()
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 String Magic”的事实:错误输入视图名称时的错误不那么模糊,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),
]
将字符串作为 view 传递给 url()
与上一项相关,不推荐在 url()
函数中将视图作为字符串引用。 改为传递上一节所述的可调用视图。
django.core.context_processors
内置模板上下文处理器已移至 django.template.context_processors
。
django.test.SimpleTestCase.urls
用于在测试中指定 URLconf 配置的属性 SimpleTestCase.urls
已被弃用,并将在 Django 1.10 中删除。 改用 @override_settings(ROOT_URLCONF=...)。
prefix 参数 i18n_patterns()
与上一项相关,django.conf.urls.i18n.i18n_patterns() 的 prefix
参数已被弃用。 只需传递 django.conf.urls.url() 实例的列表。
将虚线路径传递给 reverse() 和 :ttag:`url`
通过 Python 路径反转 URL 是一项昂贵的操作,因为它会导致导入被反转的路径。 此行为还导致了 安全问题 。 使用 命名的 URL 模式 来代替。
如果您使用 django.contrib.sitemaps,请将 name
参数添加到引用 django.contrib.sitemaps.views.sitemap()[ X154X]:
from django.contrib.sitemaps.views import sitemap
url(r'^sitemap\.xml$', sitemap, {'sitemaps': sitemaps},
name='django.contrib.sitemaps.views.sitemap')
在 Django 1.10 中删除了通过 Python 路径反转时的兼容性。
同样对于 GIS 站点地图,添加 name='django.contrib.gis.sitemaps.views.kml'
或 name='django.contrib.gis.sitemaps.views.kmz'
。
如果您为 :setting:`LOGIN_URL` 或 :setting:`LOGIN_REDIRECT_URL` 设置使用 Python 路径,请改用 url()
的名称。
聚合方法和模块
django.db.models.sql.aggregates
和 django.contrib.gis.db.models.sql.aggregates
模块(均为私有 API)已被弃用,因为 django.db.models.aggregates
和 django.contrib.gis.db.models.aggregates
现在也负责 SQL 生成。 旧模块将在 Django 1.10 中删除。
如果您使用的是旧模块,请参阅 查询表达式 以获取有关使用新的稳定 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
来解析传递给命令的命令行参数。 这也意味着向命令添加自定义参数的方式已更改:您现在应该覆盖 add_arguments() 方法并通过 argparse.add_argument()
。 有关更多详细信息,请参阅 此示例 。
django.core.management.NoArgsCommand
类 NoArgsCommand
现在已弃用,并将在 Django 1.10 中删除。 使用 BaseCommand 代替,默认情况下不接受任何参数。
ModelChoiceField 和 ModelMultipleChoiceField 的 cache_choices 选项
ModelChoiceField 和 ModelMultipleChoiceField 采用了一个未记录、未经测试的选项 cache_choices
。 这个缓存的查询集在同一个 Form
对象的多个渲染之间。 此选项会加速弃用,并将在 Django 1.9 中删除。
django.template.resolve_variable()
该功能已被非正式地标记为“已弃用”一段时间。 将 resolve_variable(path, context)
替换为 django.template.Variable(path).resolve(context)
。
django.contrib.webdesign
它提供了 :ttag:`lorem` 模板标签,现在包含在内置标签中。 只需从模板中删除 'django.contrib.webdesign'
:setting:`INSTALLED_APPS` 和 {% load webdesign %}
。
error_message 参数到 django.forms.RegexField
它为 1.0 之前的代码提供了向后兼容性,但其功能是多余的。 请改用 Field.error_messages['invalid']
。
旧的 :tfilter:`unordered_list` 语法
:tfilter:`unordered_list` 模板过滤器的旧版(1.0 之前)、更严格、更详细的输入格式已被弃用:
['States', [[../'Kansas', [['Lawrence', []], ['Topeka', []]]], ['Illinois', []]]]
使用新语法,这变成:
['States', ['Kansas', ['Lawrence', 'Topeka'], 'Illinois']]
is_admin_site 参数到 django.contrib.auth.views.password_reset()
这是一个不再需要的遗留选项。
SubfieldBase
django.db.models.fields.subclassing.SubfieldBase
已被弃用,将在 Django 1.10 中移除。 从历史上看,它用于处理从数据库加载时需要类型转换的字段,但未在 .values()
调用或聚合中使用。 它已被替换为 from_db_value()。
新方法不像 SubfieldBase
那样在赋值时调用 to_python() 方法。 如果您需要这种行为,请在您的项目中重新实现 Django 源代码 中的 Creator
类 。
django.utils.checksums
django.utils.checksums
模块已被弃用,将在 Django 1.10 中删除。 它提供的功能(使用 Luhn 算法验证校验和)没有记录,也没有在 Django 中使用。 该模块已移至 django-localflavor 包(版本 1.1+)。
InlineAdminForm.original_content_type_id
InlineAdminForm
上的 original_content_type_id
属性已被弃用,并将在 Django 1.10 中删除。 历史上,它被用来构建“现场查看”URL。 现在可以使用表单的 absolute_url
属性访问此 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()。
Template 和 Context 模板响应中的类
SimpleTemplateResponse 和 TemplateResponse 的一些方法接受 django.template.Context 和 django.template.Template 对象作为参数。 他们现在应该分别接收 dict
和后端相关的模板对象。
如果您对任一模板响应类进行了子类化,这也适用于返回类型。
查看 模板响应 API 文档 了解详细信息。
渲染函数的 dictionary 和 context_instance 参数
以下函数将不再接受 Django 1.10 中的 dictionary
和 context_instance
参数:
django.shortcuts.render()
django.shortcuts.render_to_response()
django.template.loader.render_to_string()
请改用 context
参数。 当 dictionary
作为位置参数传递时,这是最常见的习惯用法,不需要更改。
如果您在 context_instance
中传递 Context,请改为在 context
参数中传递 dict
。 如果您要传递 RequestContext,请在 request
参数中单独传递请求。
dirs 模板查找函数的参数
以下函数将不再接受 dirs
参数来覆盖 Django 1.10 中的 TEMPLATE_DIRS
:
django.template.loader.get_template()
django.template.loader.select_template()
django.shortcuts.render()
django.shortcuts.render_to_response()
该参数在不同的模板加载器中无法一致地工作,并且不适用于包含的模板。
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 中删除。
支持自定义 Storage 类上的 max_length 参数
Storage
子类应该将 max_length=None
作为参数添加到 get_available_name() 和/或 save() 如果它们覆盖任一方法。 Django 1.10 中将删除对不接受此参数的存储的支持。
qn 替换为 compiler
在以前的 Django 版本中,各种内部 ORM 方法(主要是 as_sql
方法)接受 qn
(用于“引用名称”)参数,该参数是对引用标识符的函数的引用,用于发送到数据库。 在 Django 1.8 中,该参数已重命名为 compiler
,现在是一个完整的 SQLCompiler
实例。 为了向后兼容,调用 SQLCompiler
实例执行与 qn
函数所使用的相同的名称引用。 然而,这个向后兼容的 shim 立即被弃用:你应该将你的 qn
参数重命名为 compiler
,并在你之前调用 qn(...)
的地方调用 compiler.quote_name_unless_alias(...)
。
使用 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
以选择加入。 请先阅读【X16X】升级注意事项【X42X】。
django.contrib.sitemaps.FlatPageSitemap
django.contrib.sitemaps.FlatPageSitemap
已移至 django.contrib.flatpages.sitemaps.FlatPageSitemap
。 旧的导入位置已弃用,将在 Django 1.9 中删除。
ssi 模板标签
ssi
模板标签允许通过绝对路径将文件包含在模板中。 这在大多数部署情况下用途有限,:ttag:`include` 标签通常更有意义。 此标签现已弃用,并将在 Django 1.10 中删除。
= 作为 if 模板标签中的比较运算符
使用带有 {% if %}
模板标签的单个等号进行相等测试是没有记录和未经测试的。 现在已弃用,取而代之的是 ==
。
ModelFormMixin.success_url 中的 %(<foo>)s 语法
ModelFormMixin.success_url 中遗留的 %(<foo>)s
语法已被弃用,并将在 Django 1.10 中删除。
GeoQuerySet 聚合方法
collect()
、extent()
、extent3d()
、make_line()
和 unionagg()
聚合方法已弃用,应替换为基于函数的聚合等效项(Collect
、Extent
、Extent3D
、MakeLine
和 Union
)。
allow_migrate路由器方法的签名
数据库路由器的allow_migrate()方法的签名从allow_migrate(db, model)
变成了allow_migrate(db, app_label, model_name=None, **hints)
。
设置 model_name
后,以前通过 model
位置参数给出的值现在可以在 hints
字典中的 'model'
键下找到。
切换到新签名后,路由器也将被 RunPython 和 RunSQL 操作调用。
1.8 中删除的功能
这些功能已达到弃用周期的终点,并在 Django 1.8 中删除。 有关详细信息,包括如何删除这些功能的使用,请参阅 1.6 中弃用的功能。
django.contrib.comments
被移除。- 删除了以下事务管理 API:
TransactionMiddleware
- 装饰器和上下文管理器
autocommit
、commit_on_success
和commit_manually
,在django.db.transaction
中定义 - 函数
commit_unless_managed
和rollback_unless_managed
,也在django.db.transaction
中定义 TRANSACTIONS_MANAGED
设置
- :ttag:`cycle` 和 :ttag:`firstof` 模板标签自动转义它们的参数。
SEND_BROKEN_LINK_EMAILS
设置被删除。django.middleware.doc.XViewMiddleware
被移除。Model._meta.module_name
别名被删除。- 为重命名
get_query_set
而引入的向后兼容垫片和类似的查询集方法被删除。 这会影响以下类别:BaseModelAdmin
、ChangeList
、BaseCommentNode
、GenericForeignKey
、Manager
、SingleRelatedObjectDescriptor
和ReverseSingleRelatedObjectDescriptor
。 - 删除了为重命名属性
ChangeList.root_query_set
和ChangeList.query_set
而引入的向后兼容垫片。 django.views.defaults.shortcut
和django.conf.urls.shortcut
被移除。- 删除了对 Python Imaging Library (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.CacheMiddleware
和django.middleware.cache.UpdateCacheMiddleware
没有弃用警告,但此更改会影响后者。- 使用硬编码 在 Mac 上按住“Control”或“Command”选择多个. 字符串以覆盖或附加到用户提供的
help_text
表单中ManyToMany
模型字段不再由 Django 在模型或表单层执行。 Model._meta.get_(add|change|delete)_permission
方法被删除。- 为了向后兼容,不再读取会话密钥
django_language
。 - 地理站点地图被删除(
django.contrib.gis.sitemaps.views.index
和django.contrib.gis.sitemaps.views.sitemap
)。 django.utils.html.fix_ampersands
、fix_ampersands
模板过滤器和django.utils.html.clean_html
被删除。