Django 1.7 发行说明 — Django 文档
Django 1.7 发行说明
2014 年 9 月 2 日
欢迎使用 Django 1.7!
这些发行说明涵盖了 新功能 ,以及一些 向后不兼容的更改 ,您在从 Django 1.6 或更旧版本升级时需要注意。 我们已经 开始了一些功能 的弃用过程,并且一些功能已经达到了弃用过程的结束,并且 已被删除 。
Python兼容性
Django 1.7 需要 Python 2.7、3.2、3.3 或 3.4。 我们【X3X】强烈推荐【X23X】,官方只支持各系列的最新版本。
Django 1.6 系列是最后一个支持 Python 2.6 的。 Django 1.7 是第一个支持 Python 3.4 的版本。
此更改应仅影响少数 Django 用户,因为当今大多数操作系统供应商都将 Python 2.7 或更高版本作为其默认版本提供。 但是,如果您仍在使用 Python 2.6,则需要坚持使用 Django 1.6,直到您可以升级 Python 版本。 根据 我们的支持政策 ,Django 1.6 将继续获得安全支持,直到 Django 1.8 发布。
Django 1.7 中的新功能
模式迁移
Django 现在内置了对模式迁移的支持。 它允许通过创建代表模型更改的迁移文件来更新、更改和删除模型,这些文件可以在任何开发、暂存或生产数据库上运行。
迁移在 自己的文档 中有介绍,但一些关键特性是:
syncdb
已被弃用并由migrate
取代。 别担心 - 调用syncdb
仍然可以像以前一样工作。新的
makemigrations
命令提供了一种简单的方法来自动检测对模型的更改并为它们进行迁移。django.db.models.signals.pre_syncdb
和django.db.models.signals.post_syncdb
已被弃用,分别替换为 pre_migrate 和 post_migrate。 这些新信号的论点略有不同。 查看文档了解详细信息。数据库路由器上的
allow_syncdb
方法现在称为allow_migrate
,但仍执行相同的功能。 带有allow_syncdb
方法的路由器仍然可以工作,但该方法名称已被弃用,您应该尽快更改它(只需要重命名)。initial_data
不再为具有迁移的应用程序加载装置; 如果您想为应用加载初始数据,我们建议您为应用创建迁移并在operations
部分定义 RunPython 或 RunSQL 操作移民。对于具有迁移的应用程序,测试回滚行为是不同的; 特别是,除非特别要求,Django 将不再模拟非事务性数据库或
TransactionTestCase
内部的回滚。不建议让没有迁移的应用依赖(有一个 ForeignKey 或 ManyToManyField 到)有迁移的应用。
应用加载重构
从历史上看,Django 应用程序与模型紧密相连。 被称为“应用程序缓存”的单例处理已安装的应用程序和模型。 模型模块在许多 API 中用作应用程序的标识符。
随着Django应用概念的成熟,这段代码显示出一些不足。 它已被重构为“应用程序注册表”,其中模型模块不再具有核心作用,并且可以将配置数据附加到应用程序。
迄今为止的改进包括:
- 应用程序可以在启动时运行代码,在 Django 执行任何其他操作之前,使用其配置的 ready() 方法。
- 即使应用程序标签是在
models.py
之外定义的,它们也会正确分配给模型。 您不必再明确设置 app_label。 - 如果应用程序没有任何模型,则可以完全省略
models.py
。 - 可以使用应用程序配置的 label 属性重新标记应用程序,以解决标签冲突。
- 应用程序的名称可以在管理中使用应用程序配置的 verbose_name 进行自定义。
- 当 Django 启动时,管理员会自动调用 autodiscover()。 因此,您可以从 URLconf 中删除此行。
- Django 通过确定性和直接的过程在启动后立即导入所有应用程序配置和模型。 这应该可以更轻松地诊断导入问题,例如导入循环。
Field 子类的新方法
为了帮助支持模式迁移并在 Django 的未来版本中更容易地添加复合键,Field API 现在有一个新的必需方法:deconstruct()
。
此方法不接受任何参数,并返回一个包含四项的元组:
name
:字段在其父模型上的属性名称,如果它不是模型的一部分,则为None
path
:该字段的类的虚线 Python 路径,包括类名。args
:位置参数,作为列表kwargs
:关键字参数,作为字典
这四个值允许将任何字段序列化到一个文件中,并允许安全地复制该字段,这些都是这些新功能的重要组成部分。
除非您编写自定义 Field 子类,否则此更改不会影响您; 如果这样做,如果您的子类以任何方式更改了 __init__
的方法签名,则您可能需要重新实现 deconstruct()
方法。 如果您的字段只是从内置的 Django 字段继承而来,并且没有覆盖 __init__
,则无需更改。
如果您确实需要覆盖 deconstruct()
,一个好的起点是将内置 Django 字段 (django/db/models/fields/__init__.py
) 作为多个字段,包括 DecimalField
和 DateField
],覆盖它并展示如何调用超类上的方法,并简单地添加或删除额外的参数。
这也意味着字段的所有参数本身必须是可序列化的; 要了解我们认为可序列化的内容,并了解如何使您自己的类可序列化,请阅读 迁移序列化文档 。
从 Manager 调用自定义 QuerySet 方法
从历史上看,进行可重用模型查询的推荐方法是在自定义 Manager
类上创建方法。 这种方法的问题在于,在第一个方法调用之后,您将返回一个 QuerySet
实例并且无法调用其他自定义管理器方法。
虽然没有记录,但通常通过创建自定义 QuerySet
来解决此问题,以便可以链接自定义方法; 但该解决方案有许多缺点:
- 自定义
QuerySet
及其自定义方法在第一次调用values()
或values_list()
后丢失。 - 编写自定义
Manager
仍然需要返回自定义QuerySet
类,并且Manager
上所需的所有方法都必须代理到QuerySet
。 整个过程违背了 DRY 原则。
QuerySet.as_manager() 类方法现在可以直接 使用 QuerySet 方法 创建管理器:
class FoodQuerySet(models.QuerySet):
def pizzas(self):
return self.filter(kind='pizza')
def vegetarian(self):
return self.filter(vegetarian=True)
class Food(models.Model):
kind = models.CharField(max_length=50)
vegetarian = models.BooleanField(default=False)
objects = FoodQuerySet.as_manager()
Food.objects.pizzas().vegetarian()
遍历反向关系时使用自定义管理器
现在可以在遍历反向关系时 指定自定义管理器 :
class Blog(models.Model):
pass
class Entry(models.Model):
blog = models.ForeignKey(Blog)
objects = models.Manager() # Default Manager
entries = EntryManager() # Custom Manager
b = Blog.objects.get(id=1)
b.entry_set(manager='entries').all()
新的系统检查框架
我们添加了一个新的 系统检查框架 ,用于检测常见问题(如无效模型)并提供解决这些问题的提示。 该框架是可扩展的,因此您可以为自己的应用程序和库添加自己的检查。
要执行系统检查,请使用 :djadmin:`check` 管理命令。 此命令替换旧的 validate
管理命令。
管理员快捷方式支持时区
管理员中日期和时间输入小部件旁边的“今天”和“现在”快捷方式现在在 当前时区 中运行。 以前,他们使用浏览器时区,当它与服务器上的当前时区不匹配时,这可能会导致保存错误的值。
此外,当浏览器和服务器时区不同时,小部件现在会显示帮助消息,以阐明如何解释插入到字段中的值。
使用数据库游标作为上下文管理器
在 Python 2.7 之前,数据库游标可以用作上下文管理器。 特定后端的游标定义了上下文管理器的行为。 Python 2.7 更改了魔术方法查找的行为,并且游标不再可用作上下文管理器。
Django 1.7 允许将游标用作上下文管理器。 也就是说,可以使用以下内容:
with connection.cursor() as c:
c.execute(...)
代替:
c = connection.cursor()
try:
c.execute(...)
finally:
c.close()
自定义查找
现在可以为 ORM 编写自定义查找和转换。 自定义查找就像 Django 的内置查找一样(例如 lte
, icontains
) 而变换是一个新概念。
django.db.models.Lookup 类提供了一种为模型字段添加查找运算符的方法。 例如,可以为 DateFields
添加 day_lte
运算符。
django.db.models.Transform 类允许在最终查找之前转换数据库值。 例如,可以编写从字段值中提取年份的 year
转换。 转换允许链接。 在将 year
变换添加到 DateField
后,可以过滤变换后的值,例如 qs.filter(author__birthdate__year__lte=1981)
。
有关自定义查找和转换的更多信息,请参阅 自定义查找 文档。
Form 错误处理的改进
Form.add_error()
以前有两种处理表单错误的主要模式:
- 从某些函数中引发 ValidationError(例如
Field.clean()
、Form.clean_<fieldname>()
或Form.clean()
用于非现场错误。) - 在针对
Form.clean()
中的特定字段或从“干净”方法外部添加错误时摆弄Form._errors
(例如 直接从视图)。
使用前一种模式很简单,因为形式可以从上下文中猜测(即 哪个方法引发了异常)错误所属的地方并自动处理它们。 如果可能,这仍然是添加错误的规范方式。 然而,后者繁琐且容易出错,因为处理边缘情况的负担落在了用户身上。
新的 add_error() 方法允许从任何地方向特定表单字段添加错误,而不必担心创建 django.forms.utils.ErrorList
实例或处理 Form.cleaned_data
等细节。 这个新 API 取代了现在成为私有 API 的操纵 Form._errors
。
有关使用 Form.add_error()
的示例,请参阅 清理和验证相互依赖的字段 。
错误元数据
ValidationError 构造函数接受诸如错误 code
或 params
之类的元数据,然后这些元数据可用于插入到错误消息中(有关更多详细信息,请参阅 Raising ValidationError ); 然而,在 Django 1.7 之前,一旦将错误添加到 Form.errors 中,这些元数据就会被丢弃。
Form.errors 和 django.forms.utils.ErrorList
现在存储 ValidationError
实例,因此可以通过新的 Form.errors.as_data 方法随时检索这些元数据.
然后可以识别检索到的 ValidationError
实例,这要归功于它们的错误 code
,它可以在出现给定错误时重写错误消息或在视图中编写自定义逻辑。 它还可用于以自定义格式(例如 XML)序列化错误。
新的 Form.errors.as_json() 方法是一种方便的方法,它返回错误消息以及序列化为 JSON 的错误代码。 as_json()
使用 as_data()
并给出了如何扩展新系统的想法。
错误容器和向后兼容性
为了支持上述功能,需要对各种错误容器进行大量更改,特别是 Form.errors、django.forms.utils.ErrorList
和 ValidationError 的内部存储。 这些用于存储错误字符串的容器现在存储 ValidationError
实例,并且公共 API 已经过调整以使其尽可能透明,但是如果您一直使用私有 API,则某些更改向后不兼容; 有关更多详细信息,请参阅 ValidationError 构造函数和内部存储 。
小功能
django.contrib.admin
- 您现在可以在自定义 AdminSite 上实现 site_header、site_title 和 index_title 属性,以便轻松更改管理站点的页面标题和标题文本。 不再需要覆盖模板!
- django.contrib.admin 中的按钮现在将
border-radius
CSS 属性用于圆角而不是 GIF 背景图像。 - 一些管理模板现在在它们的
<body>
标签中有app-<app_name>
和model-<model_name>
类,以允许自定义每个应用程序或每个模型的 CSS。 - 管理更改列表单元格现在在 HTML 中有一个
field-<field_name>
类以启用样式自定义。 - 由于新的 django.contrib.admin.ModelAdmin.get_search_fields() 方法,现在可以根据请求自定义管理员的搜索字段。
- ModelAdmin.get_fields() 方法可以被覆盖以自定义 ModelAdmin.fields 的值。
- 除了现有的
admin.site.register
语法,您还可以使用新的 register() 装饰器来注册一个 ModelAdmin。 - 您可以指定 ModelAdmin.list_display_links
= None
以禁用更改列表页面网格上的链接。 - 您现在可以指定 ModelAdmin.view_on_site 来控制是否显示“现场查看”链接。
- 您可以通过在
admin_order_field
值前面加上连字符来指定 ModelAdmin.list_display 值的降序。 - ModelAdmin.get_changeform_initial_data() 方法可以被覆盖以定义用于设置初始更改表单数据的自定义行为。
django.contrib.auth
- 任何传递给 email_user() 的
**kwargs
都会传递给底层的 send_mail() 调用。 - permission_required() 装饰器可以获取权限列表和单个权限。
- 您可以覆盖新的 AuthenticationForm.confirm_login_allowed() 方法以更轻松地自定义登录策略。
django.contrib.auth.views.password_reset()
采用可选的html_email_template_name
参数,用于发送多部分 HTML 电子邮件以重置密码。- 添加了 AbstractBaseUser.get_session_auth_hash() 方法,如果您的 :setting:`AUTH_USER_MODEL` 继承自 AbstractBaseUser,如果
django.contrib.auth.middleware.SessionAuthenticationMiddleware
启用。 有关更多详细信息,请参阅 更改密码时会话失效 。
django.contrib.formtools
- 对
WizardView.done()
的调用现在包含一个form_dict
,以便更轻松地按步骤名称访问表单。
django.contrib.gis
- 小部件中包含的默认 OpenLayers 库版本已从 2.11 更新到 2.13。
- 如果安装了 GEOS 3.3 或更高版本,准备好的几何图形现在还支持
crosses
、disjoint
、overlaps
、touches
和within
谓词。
django.contrib.messages
- 使用 cookie 的 django.contrib.messages 的后端现在将遵循 :setting:`SESSION_COOKIE_SECURE` 和 :setting:`SESSION_COOKIE_HTTPONLY` 设置。
- 消息上下文处理器现在在名称
DEFAULT_MESSAGE_LEVELS
下添加了一个默认级别的字典。 - Message 对象现在具有
level_tag
属性,其中包含消息级别的字符串表示。
django.contrib.redirects
- RedirectFallbackMiddleware 有两个新属性(response_gone_class 和 response_redirect_class),用于指定中间件返回的 HttpResponse 实例的类型。
django.contrib.sessions
"django.contrib.sessions.backends.cached_db"
会话后端现在尊重 :setting:`SESSION_CACHE_ALIAS`。 在以前的版本中,它总是使用default
缓存。
django.contrib.sitemaps
- 站点地图框架 现在利用 lastmod 在响应中设置
Last-Modified
标头。 这使得 ConditionalGetMiddleware 可以处理设置lastmod
的站点地图的条件GET
请求。
django.contrib.staticfiles
静态文件存储类可以通过设置file_permissions_mode和directory_permissions_mode参数来覆盖收集的静态文件和目录接收的权限。 参见 :djadmin:`collectstatic` 示例用法。
CachedStaticFilesStorage
后端有一个名为 ManifestStaticFilesStorage 的兄弟类,它根本不使用缓存系统,而是一个名为staticfiles.json
的 JSON 文件,用于存储原始文件之间的映射姓名(例如css/styles.css
) 和散列文件名(例如css/styles.55e7cbb9ba48.css
)。staticfiles.json
文件是在运行 :djadmin:`collectstatic` 管理命令时创建的,对于 Amazon S3 等远程存储来说应该是一种更便宜的替代方案。有关更多信息,请参阅 ManifestStaticFilesStorage 文档。
:djadmin:`findstatic` 现在接受详细标志级别 2,这意味着它将显示它搜索的目录的相对路径。 有关示例输出,请参见 :djadmin:`findstatic`。
缓存
- 现在可以通过 django.core.cache.caches 访问在 :setting:`CACHES` 中配置的缓存。 这个类似 dict 的对象为每个线程提供不同的实例。 它取代了现在已弃用的
django.core.cache.get_cache()
。 - 如果您直接实例化缓存后端,请注意它们不再是线程安全的,因为 django.core.cache.caches 现在每个线程产生不同的实例。
- 定义 :设置:`超时 ` 的论证 :设置:`缓存` 设置为
None
默认情况下将缓存键设置为“非过期”。 以前,只能将timeout=None
传递给缓存后端的set()
方法。
电子邮件
- send_mail() 现在接受
html_message
参数来发送多部分 text/plain 和 text/html 电子邮件。 - SMTP EmailBackend 现在接受
timeout
参数。
文件存储
- Windows 上的文件锁定以前依赖于 PyWin32 包; 如果未安装,文件锁定会以静默方式失败。 该依赖项已被删除,文件锁定现在在 Windows 和 Unix 上本地实现。
文件上传
- 新的 UploadedFile.content_type_extra 属性包含在文件上传时传递给
content-type
标头的额外参数。 - 新的 :setting:`FILE_UPLOAD_DIRECTORY_PERMISSIONS` 设置控制文件上传期间创建的目录的文件系统权限,就像 :setting:`FILE_UPLOAD_PERMISSIONS` 对文件本身所做的那样。
- FileField.upload_to 属性现在是可选的。 如果省略或给出
None
或空字符串,则不会使用子目录来存储上传的文件。 - 现在,在将响应传递给客户端之前,已明确关闭上传的文件。 只要在上传处理程序中命名为
file
,部分上传的文件也会被关闭。 - Storage.get_available_name() 现在附加一个下划线和一个随机的 7 个字符的字母数字字符串(例如
"_x3a1gho"
),而不是遍历一个下划线后跟一个数字(例如"_1"
、"_2"
等)以防止拒绝服务攻击。 此更改也在 1.6.6、1.5.9 和 1.4.14 安全版本中进行。
表格
- 由 RadioSelect 和 CheckboxSelectMultiple 在单选按钮或复选框上循环时呈现的
<label>
和<input>
标签现在包括for
和 [ X178X] 属性。 每个单选按钮或复选框都包含一个id_for_label
属性来输出元素的 ID。 - 如果 TextField 模型字段具有
max_length
,则由 Textarea 渲染的<textarea>
标签现在包含maxlength
属性。 - Field.choices 现在允许您通过包含一个带有空字符串的元组或
None
作为键和自定义标签作为值来自定义“空选择”标签。 在这种情况下,默认的空白选项"----------"
将被省略。 - MultiValueField 通过将
require_all_fields
参数设置为False
来允许可选的子字段。 将遵守每个单独字段的required
属性,并且当任何必填字段为空时,将引发新的incomplete
验证错误。 - 表单上的 clean() 方法不再需要返回
self.cleaned_data
。 如果它确实返回了一个更改过的字典,那么它仍然会被使用。 - 在 Django 1.6 中暂时回归后,现在可以再次使 TypedChoiceField
coerce
方法返回任意值。 - SelectDateWidget.months 可用于自定义选择小部件中显示的月份的措辞。
min_num
和validate_min
参数被添加到 formset_factory() 以允许验证提交的表单的最小数量。Form
和ModelForm
使用的元类已经过重新设计,以支持更多的继承场景。 只要ModelForm
首先出现在 MRO 中,先前阻止同时继承Form
和ModelForm
的限制已被删除。- 现在可以通过将名称设置为
None
在子类化时从Form
中删除字段。 - 现在可以自定义
ModelForm
的unique
、unique_for_date
和unique_together
约束的错误消息。 为了支持unique_together
或任何其他NON_FIELD_ERROR
,ModelForm
现在在ModelForm
的内部Meta
类。 有关更多详细信息,请参阅 有关模型 error_messages 的注意事项。
国际化
- django.middleware.locale.LocaleMiddleware.response_redirect_class 属性允许您自定义中间件发出的重定向。
- LocaleMiddleware 现在使用会话密钥
_language
存储用户选择的语言。 这只能使用 LANGUAGE_SESSION_KEY 常量访问。 以前它是用键django_language
存储的,而LANGUAGE_SESSION_KEY
常量不存在,但为 Django 保留的键应该以下划线开头。 为了向后兼容django_language
仍然从 1.7 中读取。 会话将在写入时迁移到新密钥。 - :ttag:`blocktrans` 标签现在支持
trimmed
选项。 此选项将从{% blocktrans %}
标签内容的开头和结尾删除换行符,替换行首和行尾的任何空格,并使用空格字符将所有行合并为一行以分隔它们。 这对于缩进{% blocktrans %}
标签的内容非常有用,而不会使缩进字符以 PO 文件中的相应条目结尾,这使得翻译过程更容易。 - 当您从项目的根目录运行 :djadmin:`makemessages` 时,任何提取的字符串现在将自动分发到适当的应用程序或项目消息文件。 有关详细信息,请参阅 本地化:如何创建语言文件 。
- :djadmin:`makemessages` 命令现在总是将
--previous
命令行标志添加到msgmerge
命令,将先前翻译的字符串保留在 po 文件中用于模糊字符串。 - 引入了以下用于调整语言 cookie 选项的设置: :setting:`LANGUAGE_COOKIE_AGE`、:setting:`LANGUAGE_COOKIE_DOMAIN` 和 :setting:`LANGUAGE_COOKIE_PATH`[X20X] .
- 为世界语添加了 格式本地化 。
管理命令
django-admin
的新--no-color
选项禁用了管理命令输出的着色。新的
dumpdata --natural-foreign
和dumpdata --natural-primary
选项,以及serializers.serialize()
的新use_natural_foreign_keys
和use_natural_primary_keys
参数,允许在以下情况下使用自然主键连载。不再需要为 :djadmin:`createcachetable` 命令提供缓存表名称或
--database
选项。 Django 从您的设置文件中获取此信息。 如果您配置了多个缓存或多个数据库,则会创建所有缓存表。:djadmin:`runserver` 命令获得了多项改进:
在Linux系统上,如果安装了pyinotify,当文件发生变化时,开发服务器会立即重新加载。 以前,它每秒轮询文件系统以获取更改。 这导致重新加载之前的小延迟并缩短了笔记本电脑的电池寿命。
另外,当翻译文件更新时,开发服务器会自动重新加载,即 运行后 :djadmin:`compilemessages`。
所有的 HTTP 请求都会记录到控制台,包括对静态文件的请求或曾经被过滤掉的
favicon.ico
。
如果 ANSICON 第三方工具已安装并处于活动状态,管理命令现在可以在 Windows 下生成语法彩色输出。
:djadmin:`collectstatic` 带有符号链接选项的命令现在支持 Windows NT 6(Windows Vista 和更新版本)。
如果安装了 sqlparse Python 库,初始 SQL 数据现在可以更好地工作。
请注意,它已被弃用,以支持迁移的 RunSQL 操作,这得益于改进的行为。
型号
- 添加了 QuerySet.update_or_create() 方法。
- 新的 default_permissions 模型
Meta
选项允许您自定义(或禁用)默认添加、更改和删除权限的创建。 - 显式 OneToOneField 用于 多表继承 现在在抽象类中被发现。
- 现在可以通过将 related_name 设置为
'+'
或以'+'
结尾来避免为 OneToOneField 创建反向关系。 - F 表达式 支持幂运算符 (
**
)。 - 由
ForeignKey
和GenericForeignKey
创建的相关管理器的remove()
和clear()
方法现在接受bulk
关键字参数来控制是否批量执行操作(即 使用QuerySet.update()
)。 默认为True
。 - 现在可以使用
None
作为 :lookup:`iexact` 查找的查询值。 - 现在可以在定义
ForeignKey
或ManyToManyField
时将可调用作为属性 limit_choices_to 的值传递。 - 对 QuerySet.values() 的结果调用 only() 和 defer() 现在会引发错误(在此之前,它会导致数据库错误或不正确的数据)。
- 在指定一组字段时,您可以为 index_together 使用单个列表(而不是列表列表)。
- 现在允许对参与多对多关系的任何模型具有多个外键的自定义中间模型,前提是您通过设置新的 ManyToManyField.through_fields 明确指定应使用哪些外键争论。
- 将模型实例分配给非关系字段现在将引发错误。 以前,如果该字段接受整数作为输入,因为它采用主键,则这曾经有效。
- 整数字段现在根据它们的 internal_type 针对数据库后端特定的最小值和最大值进行验证。 以前模型字段验证不会阻止保存关联列数据类型范围之外的值,从而导致完整性错误。
- 现在可以通过使用其属性名称显式 order_by() 关系
_id
字段。
信号
enter
参数已添加到 setting_changed 信号中。- 现在可以使用
'app_label.ModelName'
形式的str
连接模型信号 - 就像相关字段一样 - 懒惰地引用它们的发送者。
模板
- Context.push() 方法现在返回一个上下文管理器,它会在退出
with
语句时自动调用 pop()。 此外,push() 现在接受传递给用于构建新上下文级别的dict
构造函数的参数。 - 新的 Context.flatten() 方法将
Context
的堆栈作为一个平面字典返回。 Context
对象现在可以比较相等(在内部,这使用 Context.flatten() 所以每个Context
的堆栈的内部结构并不重要因为它们的扁平版本是相同的)。- :ttag:`widthratio` 模板标签现在接受一个
"as"
参数来捕获变量中的结果。 - :ttag:`include` 模板标签现在也可以接受任何带有
render()
方法(例如Template
)的参数作为参数。 字符串参数将一如既往地使用 get_template() 进行查找。 - 现在可以递归地 :ttag:`include` 模板。
- 当
TEMPLATE_DEBUG
为True
时,模板对象现在具有原点属性集。 这允许在django.template
基础设施之外检查和记录模板来源。 TypeError
在渲染模板期间引发的异常不再被静音。- 以下函数现在接受
dirs
参数,它是一个列表或元组来覆盖TEMPLATE_DIRS
:django.template.loader.get_template()
django.template.loader.select_template()
django.shortcuts.render()
django.shortcuts.render_to_response()
- :tfilter:`time` 过滤器现在接受与时区相关的 格式说明符
'e'
、'O'
、'T'
和'Z'
并且能够消化 时区感知datetime
执行预期渲染的实例。 - :ttag:`cache` 标签现在将尝试使用名为“template_fragments”的缓存(如果存在),否则将回退到使用默认缓存。 它现在还接受一个可选的
using
关键字参数来控制它使用的缓存。 - 新的 :tfilter:`truncatechars_html` 过滤器将字符串截断为不超过指定的字符数,同时考虑 HTML。
请求和响应
- 新的 HttpRequest.scheme 属性指定请求的方案(通常为
http
或https
)。 - 快捷方式 redirect() 现在支持相对 URL。
- HttpResponse 的新 JsonResponse 子类有助于轻松创建 JSON 编码的响应。
测试
- DiscoverRunner 有两个新属性,test_suite 和 test_runner,它们有助于覆盖测试收集和运行的方式。
fetch_redirect_response
参数被添加到 assertRedirects()。 由于测试客户端无法获取外部 URL,因此您可以将assertRedirects
与不属于 Django 应用程序的重定向一起使用。- 在 assertRedirects() 中进行比较时正确处理方案。
secure
参数被添加到 Client 的所有请求方法中。 如果是True
,则请求将通过 HTTPS 进行。- assertNumQueries() 现在在断言失败时打印出已执行查询的列表。
- 由测试处理程序生成的
WSGIRequest
实例现在附加到 django.test.Response.wsgi_request 属性。 - 用于测试的数据库设置已收集到名为 :设置:`测试 ` .
验证器
- RegexValidator 现在接受可选的 flags 和布尔值 inverse_match 参数。 inverse_match 属性确定当正则表达式模式匹配 (
True
) 或不匹配 (False
,默认情况下是否应该引发 ValidationError ) 提供的value
。 flags 属性设置编译正则表达式字符串时使用的标志。 - URLValidator 现在接受一个可选的
schemes
参数,它允许自定义接受的 URI 方案(而不是默认的http(s)
和ftp(s)
)。 - validate_email() 现在接受具有 IPv6 文字的地址,如
example@[2001:db8::1]
,如 RFC 5321 中所指定。
1.7 中向后不兼容的更改
allow_syncdb / allow_migrate
尽管 Django 仍会查看 allow_syncdb
方法,即使它们应该重命名为 allow_migrate
,但传递给这些方法的模型存在细微差别。
对于具有迁移的应用程序,allow_migrate
现在将通过 历史模型 ,这是没有自定义属性、方法或管理器的特殊版本模型。 确保您的 allow_migrate
方法仅引用 model._meta
中的字段或其他项目。
初始数据
具有迁移功能的应用在完成迁移后将不会加载 initial_data
设备。 在模拟旧的 syncdb
行为的 migrate
阶段,没有迁移的应用程序将继续加载这些装置,但任何新应用程序都将不具有此支持。
相反,鼓励您在需要时在迁移中加载初始数据(使用 RunPython
操作和您的模型类); 这有一个额外的好处,即每次更改架构时都不需要更新初始数据。
此外,与 Django 旧的 syncdb
代码的其余部分一样,initial_data
已开始弃用,并将在 Django 1.9 中删除。
deconstruct() 和可序列化
Django 现在要求所有 Field 类及其所有构造函数参数都是可序列化的。 如果您以任何方式修改自定义字段中的构造函数签名,则需要实现 deconstruct() 方法; 我们已经用 关于实现此方法的说明 扩展了自定义字段文档。
所有字段参数都必须是 serializable 的要求意味着任何自定义类实例被传递到 Field 构造函数 - 例如自定义 Storage 子类之类的东西 - 也需要定义一个 解构方法,尽管 Django 提供了一个适用于大多数应用程序的方便的类装饰器。
应用加载更改
独立脚本
如果你在一个普通的 Python 脚本中使用 Django——而不是一个管理命令——并且你依赖于 DJANGO_SETTINGS_MODULE 环境变量,你现在必须在你的开始时显式初始化 Django脚本:
>>> import django
>>> django.setup()
否则,您将遇到 AppRegistryNotReady
异常。
WSGI 脚本
在 Django 1.3 之前,推荐的创建 WSGI 应用程序的方法是:
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
在 Django 1.4 中,改进了对 WSGI 的支持,API 更改为:
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
如果你在你的 WSGI 脚本中仍然使用前一种风格,你需要升级到后一种,否则你会遇到 AppRegistryNotReady
异常。
应用注册表一致性
不再可能安装多个具有相同标签的应用程序。 在以前的 Django 版本中,这并不总是正常工作,但也没有完全崩溃。
如果您有两个具有相同标签的应用程序,您应该为其中一个创建一个 AppConfig 并在那里覆盖其 标签。 然后,您应该在代码引用此应用程序或其带有旧标签的模型的任何地方调整代码。
不可能再通过不同的路径两次导入相同的模型。 从 Django 1.6 开始,只有当您手动将目录和子目录放在 PYTHONPATH
上时,才会发生这种情况。 有关迁移说明,请参阅 1.4 发行说明 中有关新项目布局的部分。
您应该确保:
- 所有模型都在 :setting:`INSTALLED_APPS` 中列出的应用程序中定义或具有明确的 app_label。
- 模型不会作为加载其应用程序的副作用而导入。 具体来说,您不应在应用程序的根模块或定义其配置类的模块中导入模型。
在弃用期之后,Django 将在 1.9 版中强制执行这些要求。
子类化 AppCommand
AppCommand 的子类现在必须实现 handle_app_config() 方法而不是 handle_app()
。 此方法接收 AppConfig 实例而不是模型模块。
内省应用程序
由于 :setting:`INSTALLED_APPS` 现在除了应用程序模块之外还支持应用程序配置类,您应该查看直接访问此设置的代码并使用应用程序注册表 (django.apps.apps ) 反而。
应用程序注册表保留了旧应用程序缓存的一些功能。 即使应用程序缓存是私有 API,过时的方法和参数也将通过标准弃用路径删除,但以下更改会立即生效:
get_model
在未找到模型时引发LookupError
而不是返回None
。get_model
和get_models
的only_installed
参数不再存在,get_model
的seed_cache
参数也不存在。
:setting:`INSTALLED_APPS`的管理命令和顺序
当多个应用程序提供同名的管理命令时,Django 从 :setting:`INSTALLED_APPS` 中最先出现的应用程序加载命令。 以前的版本从最后一个应用程序加载命令。
这使得管理命令的发现与 Django 的其他部分一致,这些部分依赖于 :setting:`INSTALLED_APPS` 的顺序,例如静态文件、模板和翻译。
ValidationError 构造函数和内部存储
ValidationError
构造函数在接收错误容器作为参数(例如 list
或 ErrorList
):
- 它将找到的任何字符串转换为
ValidationError
的实例,然后再将它们添加到其内部存储中。 - 它不存储给定的容器,而是将其内容复制到自己的内部存储中; 以前,容器本身被添加到
ValidationError
实例并用作内部存储。
这意味着如果您访问 ValidationError
内部存储,例如 error_list
; error_dict
; 或 update_error_dict()
的返回值,您可能会在之前找到字符串的地方找到 ValidationError
的实例。
此外,如果您直接将 update_error_dict()
的返回值分配给 Form._errors
,您可能会无意中添加 list
实例,其中需要 ErrorList
实例。 这是一个问题,因为与简单的 list
不同,ErrorList
知道如何处理 ValidationError
的实例。
新引入的 Form.add_error() 方法现在涵盖了大多数需要使用这些私有 API 的用例:
# Old pattern:
try:
# ...
except ValidationError as e:
self._errors = e.update_error_dict(self._errors)
# New pattern:
try:
# ...
except ValidationError as e:
self.add_error(None, e)
如果您同时需要 Django <= 1.6 和 1.7 兼容性,则不能使用 Form.add_error() 因为它在 Django 1.7 之前不可用,但您可以使用以下解决方法来转换任何list
进入ErrorList
:
try:
# ...
except ValidationError as e:
self._errors = e.update_error_dict(self._errors)
# Additional code to ensure ``ErrorDict`` is exclusively
# composed of ``ErrorList`` instances.
for field, error_list in self._errors.items():
if not isinstance(error_list, self.error_class):
self._errors[field] = self.error_class(error_list)
LocMemCache 关于pickle 错误的行为
关于不同缓存后端如何处理 pickle 错误,以前版本的 Django 中存在不一致。 django.core.cache.backends.locmem.LocMemCache
用于在发生此类错误时静默失败,这与其他后端不一致并导致特定于缓存的错误。 这已在 Django 1.7 中修复,有关更多详细信息,请参阅 :ticket:`21200`。
现在从请求的绝对 URL 生成缓存键
以前版本的 Django 使用请求的路径和查询字符串而不是方案或主机生成缓存键。 如果 Django 应用程序服务于多个子域或域,缓存键可能会发生冲突。 在 Django 1.7 中,缓存键因请求的绝对 URL 而异,包括方案、主机、路径和查询字符串。 例如,缓存键的 URL 部分现在是从 https://www.example.com/path/to/?key=val
而不是 /path/to/?key=val
生成的。 Django 1.7 生成的缓存键将与旧版本 Django 生成的键不同。 升级到 Django 1.7 后,对任何先前缓存的 URL 的第一个请求将是缓存未命中。
将 None 传递给 Manager.db_manager()
在以前的 Django 版本中,可以在模型管理器实例上使用 db_manager(using=None)
来获取使用默认路由行为的管理器实例,覆盖任何手动指定的数据库路由。 在 Django 1.7 中,传递给 db_manager 的 None
值将产生一个 保留 任何手动分配的数据库路由的路由器 - 管理器将 不 被重置。 这对于解决路由信息在连接上级联的方式的不一致是必要的。 有关更多详细信息,请参阅 :ticket:`13724`。
可能需要 pytz
如果您的项目处理 1970 年之前或 2037 年之后的日期时间并且 Django 在遇到它们时引发 ValueError
,则您必须安装 pytz。 如果您使用 Django 的时区相关日期格式或 django.contrib.syndication,您可能会受到此问题的影响。
管理员登录重定向策略
从历史上看,Django 管理站点将来自未经授权或未经身份验证的用户的请求直接传递到登录视图,而无需 HTTP 重定向。 在 Django 1.7 中,此行为已更改以符合更传统的工作流程,其中对管理页面的任何未经授权的请求都将(通过 HTTP 状态代码 302)重定向到登录页面,并将 next
参数设置为引用小路。 成功登录后,用户将被重定向到那里。
另请注意,管理员登录表单已更新为不包含 this_is_the_login_form
字段(现在未使用),并且 ValidationError
代码已设置为更常规的 invalid_login
键。
select_for_update() 需要交易
从历史上看,使用 select_for_update() 的查询可以在事务之外的自动提交模式下执行。 在 Django 1.6 之前,Django 的自动事务模式允许使用它来锁定记录,直到下一次写入操作。 Django 1.6 引入了数据库级自动提交; 从那时起,在这样的上下文中执行会使 select_for_update()
的效果无效。 因此,现在假定它是一个错误并引发异常。
进行此更改是因为此类错误可能是由于包含需要全局事务的应用程序(例如 :设置:`ATOMIC_REQUESTS ` 设置True
) 或 Django 旧的自动提交行为,在没有它们的项目中运行; 此外,此类错误可能表现为数据损坏错误。 它也是在 Django 1.6.3 中制作的。
如果您在作为 TransactionTestCase 而不是 TestCase 的子类的测试类中使用 select_for_update()
,则此更改可能会导致测试失败。
从默认 MIDDLEWARE_CLASSES 中删除了 Contrib 中间件
应用加载重构 不推荐使用来自应用的模型,这些模型不属于 :setting:`INSTALLED_APPS` 设置。 这暴露了默认 :setting:`INSTALLED_APPS` 和全局默认值 (django.conf.global_settings
) 中的 MIDDLEWARE_CLASSES
之间的不兼容。 为了使这些设置同步并防止在使用最少设置测试可重用应用程序时出现弃用警告,SessionMiddleware、AuthenticationMiddleware 和 MessageMiddleware 从默认值中删除. 这些类仍将包含在 :djadmin:`startproject` 生成的默认设置中。 大多数项目不会受到此更改的影响,但如果您之前没有在项目设置中声明 MIDDLEWARE_CLASSES
并依赖全局默认值,则应确保新的默认值符合您的项目需求。 您还应该检查任何直接访问 django.conf.global_settings.MIDDLEWARE_CLASSES
的代码。
杂项
django.core.files.uploadhandler.FileUploadHandler.new_file() 方法现在传递了一个额外的
content_type_extra
参数。 如果您有一个实现new_file()
的自定义 FileUploadHandler,请确保它接受这个新参数。ModelFormSets 不再在调用
save(commit=False)
时删除实例。 有关如何从已删除的表单中手动删除对象的说明,请参阅 can_delete。加载空灯具会发出
RuntimeWarning
而不是引发 CommandError。django.contrib.staticfiles.views.serve() 现在将在 :setting:`DEBUG` 时引发 Http404 异常而不是 ImproperlyConfigured ] 是
False
。 此更改消除了将视图有条件地添加到根 URLconf 的需要,从而可以安全地按名称反转。 它还消除了访问者通过请求不存在或尚未收集的静态文件来生成虚假 HTTP 500 错误的能力。django.db.models.Model.__eq__() 方法现在定义为当主键匹配时代理模型的实例及其基本模型的实例被认为是相等的。 以前只有完全相同的类的实例在主键匹配时才被认为是相等的。
django.db.models.Model.__eq__() 方法已经改变,两个没有主键值的
Model
实例不会被认为是相等的(除非它们是同一个实例)。django.db.models.Model.__hash__() 方法现在在没有主键值的实例上调用时会引发
TypeError
。 这样做是为了避免容器中可变的__hash__
值。SQLite 数据库中的 AutoField 列现在将使用
AUTOINCREMENT
选项创建,这保证了单调增量。 这将导致 SQLite 上的主键编号行为发生变化,与大多数其他 SQL 数据库保持一致。 这仅适用于新创建的表。 如果您有一个使用旧版本 Django 创建的数据库,则需要迁移它以利用此功能。 例如,您可以执行以下操作:使用 :djadmin:`dumpdata` 保存您的数据。
重命名现有的数据库文件(保留作为备份)。
运行 :djadmin:`migrate` 以创建更新的架构。
使用 :djadmin:`loaddata` 导入您在 (1) 中导出的灯具。
django.contrib.auth.models.AbstractUser
不再定义 get_absolute_url() 方法。 旧定义返回"/users/%s/" % urlquote(self.username)
,这是任意的,因为应用程序可能会或可能不会在urlpatterns
中定义这样的 url。 在您自己的自定义用户对象上定义get_absolute_url()
方法,或者如果您想要用户的 URL,请使用 :setting:`ABSOLUTE_URL_OVERRIDES`。django.test.LiveServerTestCase 类的静态资产服务功能已被简化:现在它只能在运行测试时提供 :setting:`STATIC_ROOT` 中已经存在的内容. 透明地为所有静态资产提供服务的能力(类似于人们所获得的 :设置:`调试=真 ` 在开发时)已转移到一个新类,该类位于
staticfiles
应用程序(实际负责此类功能的应用程序): django.contrib.staticfiles.testing.StaticLiveServerTestCase . 换句话说,LiveServerTestCase
本身的威力较小,但同时魔法也较少。这背后的基本原理是消除非 contrib 代码对 contrib 应用程序的依赖。
旧的缓存 URI 语法(例如
"locmem://"
) 不再受支持。 即使没有记录或官方支持,它仍然有效。 如果您仍在使用它,请更新到当前的 :setting:`CACHES` 语法。在继承的情况下
Form
字段的默认顺序已更改为遵循正常的 Python MRO。 现在通过反向迭代 MRO 来发现字段,最上面的类最后出现。 如果您依赖默认字段排序,同时在父类Form
上定义了当前类 和 上的字段,这只会影响您。SelectDateWidget 的
required
参数已被删除。 这个小部件现在像其他小部件一样尊重表单字段的is_required
属性。Widget.is_hidden
现在是只读属性,通过自省input_type == 'hidden'
的存在来获取其值。select_related() 现在以与
prefetch_related
等其他类似调用相同的方式链接。 即,select_related('foo', 'bar')
等价于select_related('foo').select_related('bar')
。 以前后者等同于select_related('bar')
。GeoDjango 放弃了对 GEOS < 3.1 的支持。
这
init_connection_state
数据库后端的方法现在以自动提交模式执行(除非您设置 :设置:`自动提交 ` 到False
)。 如果您维护自定义数据库后端,则应检查该方法。django.db.backends.BaseDatabaseFeatures.allows_primary_key_0
属性已重命名为allows_auto_pk_0
以更好地描述它。 对于 Django 中包含的所有数据库后端,它是True
,但 MySQL 允许值为 0 的主键。 它只禁止值为 0 的 autoincrement 主键。禁止在父模型中定义阴影模型字段,因为这会在预期的模型行为中产生歧义。 此外,模型继承层次结构中的冲突字段会导致系统检查错误。 例如,如果使用多继承,则需要在父模型上定义自定义主键字段,否则默认的
id
字段会发生冲突。 详见多重继承。django.utils.translation.parse_accept_lang_header()
现在返回小写的语言环境,而不是提供的大小写。 由于区域设置不区分大小写,这使我们能够加快区域设置检测。django.utils.translation.get_language_from_path()
和django.utils.translation.trans_real.get_supported_language_variant()
现在不再有supported
参数。django.contrib.contenttypes.views
中的shortcut
视图现在支持协议相对 URL(例如//example.com
)。GenericRelation 现在支持一个可选的
related_query_name
参数。 设置related_query_name
将相关对象的关系添加回内容类型,用于过滤、排序和其他查询操作。在 PostgreSQL 上运行测试时,:setting:`USER` 将需要对内置
postgres
数据库的读取访问权限。 这代替了之前连接到实际非测试数据库的行为。作为 系统检查框架 的一部分, 字段、模型和模型管理器 都实现了在检查框架中注册的
check()
方法。 如果在这些对象之一上有一个名为check()
的现有方法,则需要重命名它。如上文“次要功能”的“缓存”部分所述,定义 :设置:`超时 ` 的论证 :设置:`缓存` 设置为
None
将缓存键设置为“非过期”。 以前,使用 memcache 后端, :设置:`超时 ` 的0
会设置非过期键,但这与设置和过期不一致(即 无缓存)set("key", "value", timeout=0)
的行为。 如果您想要非过期密钥,请更新您的设置以使用None
而不是0
,因为后者现在也在设置中指定设置和过期。sql*
管理命令现在遵循 :setting:`DATABASE_ROUTERS` 的allow_migrate()
方法。 如果您将模型同步到非默认数据库,请使用--database
标志获取这些模型的 SQL(以前它们总是包含在输出中)。当输入不是有效的 UTF-8 时,从 URL 解码查询字符串现在回退到 ISO-8859-1 编码。
通过将
django.contrib.auth.middleware.SessionAuthenticationMiddleware
添加到默认项目模板(仅限 1.7.2 之前),必须在使用 :djadmin:`runserver` 访问页面之前创建数据库。如果您之前使用自定义正则表达式来验证方案,那么将
schemes
参数添加到URLValidator
将显示为向后不兼容的更改。 任何未在schemes
中列出的方案都将无法通过验证,即使正则表达式与给定的 URL 匹配。
1.7 中弃用的功能
django.utils.dictconfig/django.utils.importlib
django.utils.dictconfig
和 django.utils.importlib
分别是为 2.7 之前的 Python 版本提供的 logging.config
和 importlib
的副本。 它们已被弃用。
django.utils.module_loading.import_by_path
当前的 django.utils.module_loading.import_by_path
函数捕获 AttributeError
、ImportError
和 ValueError
异常,并重新引发 ImproperlyConfigured。 这种异常屏蔽使得诊断循环导入问题变得不必要地困难,因为它使问题看起来像是来自 Django 内部。 它已被弃用,取而代之的是 import_string()。
django.utils.tzinfo
django.utils.tzinfo
提供了两个 tzinfo
子类,LocalTimezone
和 FixedOffset
。 它们已被弃用,取而代之的是 django.utils.timezone、django.utils.timezone.get_default_timezone() 和 django.utils.timezone 提供的更正确的替代方案。 get_fixed_timezone()。
django.utils.unittest
django.utils.unittest
提供了对所有 Python 版本的 unittest2
库的统一访问。 由于 unittest2
在 Python 2.7 中成为标准库的 unittest
模块,并且 Django 1.7 不再支持旧的 Python 版本,因此该模块不再有用。 它已被弃用。 请改用 unittest
。
django.utils.datastructures.SortedDict
由于 OrderedDict
已添加到 Python 2.7 的标准库中,因此不再需要 SortedDict
并已弃用。
SortedDict
(insert()
和 value_for_index()
)提供的另外两个已弃用的方法已被删除。 如果您依赖这些方法来更改表单字段等结构,您现在应该将这些 OrderedDict
视为不可变对象并覆盖它们以更改其内容。
例如,您可能希望覆盖 MyFormClass.base_fields
(尽管此属性不被视为公共 API)以更改所有 MyFormClass
实例的字段顺序; 或者类似地,您可以从 MyFormClass.__init__()
内部覆盖 self.fields
,以更改特定表单实例的字段。 例如(来自 Django 本身):
PasswordChangeForm.base_fields = OrderedDict(
(k, PasswordChangeForm.base_fields[k])
for k in ['old_password', 'new_password1', 'new_password2']
)
模型包的自定义 SQL 位置
以前,如果模型被组织在一个包中 (myapp/models/
) 而不是简单的 myapp/models.py
,Django 会在 myapp/models/sql/
中查找初始 SQL 数据。 此错误已得到修复,以便 Django 将按照文档搜索 myapp/sql/
。 修复此问题后,添加了弃用初始 SQL 数据的迁移。 因此,虽然此更改仍然存在,但弃用已无关紧要,因为整个功能将在 Django 1.9 中删除。
django.contrib.sites重组
django.contrib.sites
不在 :setting:`INSTALLED_APPS` 中时提供减少的功能。 在这种情况下,应用加载重构会增加一些限制。 因此,移动了两个对象,并弃用了旧位置:
- RequestSite 现在位于
django.contrib.sites.requests
。 - get_current_site() 现在位于
django.contrib.sites.shortcuts
。
ModelAdmin 上的 declared_fieldsets 属性
ModelAdmin.declared_fieldsets
已被弃用。 尽管是私有 API,但它将通过常规的弃用路径。 此属性主要由绕过 ModelAdmin.get_fieldsets()
的方法使用,但这被认为是一个错误并已得到解决。
django.contrib.contenttypes重组
由于 django.contrib.contenttypes.generic
定义了与管理和模型相关的对象,因此导入此模块可能会引发意外的副作用。 因此,它的内容被拆分为 contenttypes 子模块,并且 django.contrib.contenttypes.generic
模块已被弃用:
- GenericForeignKey 和 GenericRelation 现在位于 字段 。
- BaseGenericInlineFormSet 和 generic_inlineformset_factory() 现在存在于 表单 中。
- GenericInlineModelAdmin、GenericStackedInline 和 GenericTabularInline 现在位于 admin。
syncdb
syncdb
命令已被弃用,取而代之的是新的 :djadmin:`migrate` 命令。 migrate
的参数与过去的 syncdb
相同,另外还有一些,因此只需更改您正在调用的名称即可安全。
util 模块重命名为 utils
Django 代码库中 util.py
的以下实例已重命名为 utils.py
,以统一所有 util 和 utils 引用:
django.contrib.admin.util
django.contrib.gis.db.backends.util
django.db.backends.util
django.forms.util
get_formsets 方法 ModelAdmin
ModelAdmin.get_formsets
已被弃用,取而代之的是新的 get_formsets_with_inlines(),以便更好地处理在 ModelAdmin
上有选择地显示内联的情况。
IPAddressField
django.db.models.IPAddressField
和 django.forms.IPAddressField
字段已被弃用,取而代之的是 django.db.models.GenericIPAddressField 和 django.forms.GenericIPAddressField。
BaseMemcachedCache._get_memcache_timeout 方法
BaseMemcachedCache._get_memcache_timeout()
方法已重命名为 get_backend_timeout()
。 尽管是私有 API,但它会经历正常的弃用。
自然键序列化选项
:djadmin:`dumpdata` 的 --natural
和 -n
选项已被弃用。 请改用 dumpdata --natural-foreign
。
同样,serializers.serialize()
的 use_natural_keys
参数已被弃用。 请改用 use_natural_foreign_keys
。
将 POST 和 GET 参数合并到 WSGIRequest.REQUEST
已经强烈建议您使用 GET
和 POST
而不是 REQUEST
,因为前者更明确。 属性 REQUEST
已弃用,将在 Django 1.9 中删除。
django.utils.datastructures.MergeDict 类
MergeDict
的存在主要是为了支持将 POST
和 GET
参数合并到 WSGIRequest
上的 REQUEST
属性中。 要合并字典,请改用 dict.update()
。 类 MergeDict
已弃用,将在 Django 1.9 中删除。
语言代码 zh-cn、zh-tw 和 fy-nl
当前使用的简体中文 zh-cn
、繁体中文 zh-tw
和(西)弗里斯兰语 fy-nl
的语言代码已弃用,应替换为语言代码 zh-hans
, zh-hant
和 fy
。 如果您使用这些语言代码,您应该重命名语言环境目录并更新您的设置以反映这些更改。 弃用的语言代码将在 Django 1.9 中删除。
django.utils.functional.memoize 功能
函数 memoize
已弃用,应替换为 functools.lru_cache
装饰器(从 Python 3.2 开始可用)。
Django 为旧的 Python 版本提供了这个装饰器的反向移植,它可以在 django.utils.lru_cache.lru_cache
上找到。 弃用的功能将在 Django 1.9 中删除。
地理站点地图
Google 已停止支持 Geo Sitemaps 格式。 因此,不推荐使用 Django 对地理站点地图的支持,并将在 Django 1.8 中删除。
将可调用参数传递给查询集方法
查询集的可调用参数是一个不可靠的未记录功能。 它已被弃用,并将在 Django 1.9 中删除。
可调用参数是在构造查询集时而不是在评估时评估的,因此与将参数传递给查询集之前评估参数相比,此功能没有提供任何好处,并造成混淆,即参数可能已在查询时评估。
ADMIN_FOR 设置
ADMIN_FOR
功能是 admindocs 的一部分,已被删除。 您可以在方便时从配置中删除该设置。
SplitDateTimeWidget 与 DateTimeField
DateTimeField 中的 SplitDateTimeWidget
支持已弃用,请改用 SplitDateTimeWidget
和 SplitDateTimeField。
django.core.management.BaseCommand
requires_model_validation
已弃用,取而代之的是新的 requires_system_checks
标志。 如果缺少后一个标志,则使用前一个标志的值。 同时定义 requires_system_checks
和 requires_model_validation
会导致错误。
check()
方法取代了旧的 validate()
方法。
ModelAdmin 验证器
ModelAdmin.validator_class
和 default_validator_class
属性已弃用,取而代之的是新的 checks_class
属性。
ModelAdmin.validate()
方法已被弃用,取而代之的是 ModelAdmin.check()
。
django.contrib.admin.validation
模块已弃用。
django.db.backends.DatabaseValidation.validate_field
此方法已弃用,取而代之的是新的 check_field
方法。 check_field()
所需的功能与validate_field()
提供的功能相同,但输出格式不同。 需要此功能的第三方数据库后端应提供 check_field()
的实现。
django.utils.text.javascript_quote
javascript_quote()
是 django.utils.text
中存在的未记录功能。 它在 javascript_catalog()
视图内部使用,其实现已更改为使用 json.dumps()
。 如果您依赖此函数从不受信任的字符串提供安全输出,则应使用 django.utils.html.escapejs
或 :tfilter:`escapejs` 模板过滤器。 如果您只需要生成有效的 JavaScript 字符串,您可以简单地使用 json.dumps()
。
fix_ampersands utils 方法和模板过滤器
django.utils.html.fix_ampersands
方法和 fix_ampersands
模板过滤器已被弃用,因为 Django 的标准 HTML 转义功能已经处理了&符号的转义。 将此与 fix_ampersands
结合将导致双重转义,或者,如果假设输出是安全的,则存在引入 XSS 漏洞的风险。 与 fix_ampersands
一起,django.utils.html.clean_html
已被弃用,这是一个调用 fix_ampersands
的未公开函数。 由于这是一个加速弃用,fix_ampersands
和 clean_html
将在 Django 1.8 中被删除。
数据库测试设置的重组
所有数据库设置都带有TEST_
前缀已被弃用,取而代之的是 :设置:`测试 ` 数据库设置中的字典。 Django 1.9 之前将支持旧设置。 为了与旧版本的 Django 向后兼容,您可以定义两个版本的设置,只要它们匹配即可。
FastCGI 支持
通过 runfcgi
管理命令的 FastCGI 支持将在 Django 1.9 中删除。 请使用 WSGI 部署您的项目。
在 contrib.sites 中移动物体
在应用加载重构之后,需要移动 django.contrib.sites.models
中的两个对象,因为在未安装 django.contrib.sites
时,它们必须在不导入 django.contrib.sites.models
的情况下可用。 从 django.contrib.sites.requests
导入 RequestSite
,从 django.contrib.sites.shortcuts
导入 get_current_site()
。 旧的导入位置将一直工作到 Django 1.9。
django.forms.forms.get_declared_fields()
Django 不再在内部使用此功能。 即使它是一个私有 API,它也会经历正常的弃用周期。
私有查询查找 API
私有 API django.db.models.sql.where.WhereNode.make_atom()
和 django.db.models.sql.where.Constraint
已弃用,取而代之的是新的 自定义查找 API 。
1.7 中删除的功能
这些功能已达到弃用周期的终点,并在 Django 1.7 中删除。 有关详细信息,包括如何删除这些功能的使用,请参阅 1.5 中弃用的功能。
django.utils.simplejson
被移除。django.utils.itercompat.product
被移除。- INSTALLED_APPS 和 TEMPLATE_DIRS 不再从普通字符串更正为元组。
- HttpResponse、SimpleTemplateResponse、TemplateResponse、
render_to_response()
、index()和sitemap() ] 不再采用mimetype
参数 - HttpResponse 如果它是一个迭代器,它会立即消耗它的内容。
- 删除了用户模型上的
AUTH_PROFILE_MODULE
设置和get_profile()
方法。 cleanup
管理命令被删除。daily_cleanup.py
脚本被删除。- select_related() 不再有
depth
关键字参数。 get_warnings_state()
/restore_warnings_state()
函数来自 django.test.utils 和save_warnings_state()
/restore_warnings_state()
django.test.*测试用例 被删除。- 删除了 AuthenticationForm 中的
check_for_test_cookie
方法。 - 支持 base36 编码用户 ID (
django.contrib.auth.views.password_reset_confirm_uidb36
) 的django.contrib.auth.views.password_reset_confirm()
版本被删除。 django.utils.encoding.StrAndUnicode
混音被移除。