Django 1.7 发行说明 — Django 文档

来自菜鸟教程
Django/docs/3.1.x/releases/1.7
跳转至:导航、​搜索

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_syncdbdjango.db.models.signals.post_syncdb 已被弃用,分别替换为 pre_migratepost_migrate。 这些新信号的论点略有不同。 查看文档了解详细信息。

  • 数据库路由器上的 allow_syncdb 方法现在称为 allow_migrate,但仍执行相同的功能。 带有 allow_syncdb 方法的路由器仍然可以工作,但该方法名称已被弃用,您应该尽快更改它(只需要重命名)。

  • initial_data 不再为具有迁移的应用程序加载装置; 如果您想为应用加载初始数据,我们建议您为应用创建迁移并在 operations 部分定义 RunPythonRunSQL 操作移民。

  • 对于具有迁移的应用程序,测试回滚行为是不同的; 特别是,除非特别要求,Django 将不再模拟非事务性数据库或 TransactionTestCase 内部的回滚。

  • 不建议让没有迁移的应用依赖(有一个 ForeignKeyManyToManyField 到)有迁移的应用。


应用加载重构

从历史上看,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) 作为多个字段,包括 DecimalFieldDateField ],覆盖它并展示如何调用超类上的方法,并简单地添加或删除额外的参数。

这也意味着字段的所有参数本身必须是可序列化的; 要了解我们认为可序列化的内容,并了解如何使您自己的类可序列化,请阅读 迁移序列化文档


从 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 构造函数接受诸如错误 codeparams 之类的元数据,然后这些元数据可用于插入到错误消息中(有关更多详细信息,请参阅 Raising ValidationError ); 然而,在 Django 1.7 之前,一旦将错误添加到 Form.errors 中,这些元数据就会被丢弃。

Form.errorsdjango.forms.utils.ErrorList 现在存储 ValidationError 实例,因此可以通过新的 Form.errors.as_data 方法随时检索这些元数据.

然后可以识别检索到的 ValidationError 实例,这要归功于它们的错误 code,它可以在出现给定错误时重写错误消息或在视图中编写自定义逻辑。 它还可用于以自定义格式(例如 XML)序列化错误。

新的 Form.errors.as_json() 方法是一种方便的方法,它返回错误消息以及序列化为 JSON 的错误代码。 as_json() 使用 as_data() 并给出了如何扩展新系统的想法。


错误容器和向后兼容性

为了支持上述功能,需要对各种错误容器进行大量更改,特别是 Form.errorsdjango.forms.utils.ErrorListValidationError 的内部存储。 这些用于存储错误字符串的容器现在存储 ValidationError 实例,并且公共 API 已经过调整以使其尽可能透明,但是如果您一直使用私有 API,则某些更改向后不兼容; 有关更多详细信息,请参阅 ValidationError 构造函数和内部存储


小功能

django.contrib.admin


django.contrib.auth


django.contrib.formtools

  • WizardView.done() 的调用现在包含一个 form_dict,以便更轻松地按步骤名称访问表单。


django.contrib.gis

  • 小部件中包含的默认 OpenLayers 库版本已从 2.11 更新到 2.13。
  • 如果安装了 GEOS 3.3 或更高版本,准备好的几何图形现在还支持 crossesdisjointoverlapstoucheswithin 谓词。


django.contrib.messages


django.contrib.redirects


django.contrib.sessions

  • "django.contrib.sessions.backends.cached_db" 会话后端现在尊重 :setting:`SESSION_CACHE_ALIAS`。 在以前的版本中,它总是使用 default 缓存。


django.contrib.sitemaps


django.contrib.sites


django.contrib.staticfiles


django.contrib.syndication

  • Atom1Feed 联合提要的 updated 元素现在使用 updateddate 而不是 pubdate,允许在提要中包含 published 元素(它依赖于 pubdate)。


缓存

  • 现在可以通过 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/plaintext/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 安全版本中进行。


表格

  • RadioSelectCheckboxSelectMultiple 在单选按钮或复选框上循环时呈现的 <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_numvalidate_min 参数被添加到 formset_factory() 以允许验证提交的表单的最小数量。
  • FormModelForm 使用的元类已经过重新设计,以支持更多的继承场景。 只要 ModelForm 首先出现在 MRO 中,先前阻止同时继承 FormModelForm 的限制已被删除。
  • 现在可以通过将名称设置为 None 在子类化时从 Form 中删除字段。
  • 现在可以自定义 ModelFormuniqueunique_for_dateunique_together 约束的错误消息。 为了支持 unique_together 或任何其他 NON_FIELD_ERRORModelForm 现在在 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-foreigndumpdata --natural-primary 选项,以及 serializers.serialize() 的新 use_natural_foreign_keysuse_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 表达式 支持幂运算符 (**)。
  • ForeignKeyGenericForeignKey 创建的相关管理器的 remove()clear() 方法现在接受 bulk 关键字参数来控制是否批量执行操作(即 使用 QuerySet.update())。 默认为 True
  • 现在可以使用 None 作为 :lookup:`iexact` 查找的查询值。
  • 现在可以在定义 ForeignKeyManyToManyField 时将可调用作为属性 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_DEBUGTrue 时,模板对象现在具有原点属性集。 这允许在 django.template 基础设施之外检查和记录模板来源。
  • TypeError 在渲染模板期间引发的异常不再被静音。
  • 以下函数现在接受 dirs 参数,它是一个列表或元组来覆盖 TEMPLATE_DIRS
  • :tfilter:`time` 过滤器现在接受与时区相关的 格式说明符 'e''O''T''Z' 并且能够消化 时区感知 datetime 执行预期渲染的实例。
  • :ttag:`cache` 标签现在将尝试使用名为“template_fragments”的缓存(如果存在),否则将回退到使用默认缓存。 它现在还接受一个可选的 using 关键字参数来控制它使用的缓存。
  • 新的 :tfilter:`truncatechars_html` 过滤器将字符串截断为不超过指定的字符数,同时考虑 HTML。


请求和响应


测试

  • DiscoverRunner 有两个新属性,test_suitetest_runner,它们有助于覆盖测试收集和运行的方式。
  • fetch_redirect_response 参数被添加到 assertRedirects()。 由于测试客户端无法获取外部 URL,因此您可以将 assertRedirects 与不属于 Django 应用程序的重定向一起使用。
  • assertRedirects() 中进行比较时正确处理方案。
  • secure 参数被添加到 Client 的所有请求方法中。 如果是 True,则请求将通过 HTTPS 进行。
  • assertNumQueries() 现在在断言失败时打印出已执行查询的列表。
  • 由测试处理程序生成的 WSGIRequest 实例现在附加到 django.test.Response.wsgi_request 属性。
  • 用于测试的数据库设置已收集到名为 :设置:`测试 ` .


公用事业

  • 改进了 strip_tags() 准确性(但它仍然不能保证 HTML 安全的结果,如文档中所述)。


验证器

  • RegexValidator 现在接受可选的 flags 和布尔值 inverse_match 参数。 inverse_match 属性确定当正则表达式模式匹配 (True) 或不匹配 (False,默认情况下是否应该引发 ValidationError ) 提供的 valueflags 属性设置编译正则表达式字符串时使用的标志。
  • 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 提供了一个适用于大多数应用程序的方便的类装饰器。


应用加载更改

启动顺序

Django 1.7 一启动就会加载应用程序配置和模型。 虽然这种行为更直接,并且被认为更稳健,但不能排除回归。 有关您可能遇到的一些问题的解决方案,请参阅 疑难解答


独立脚本

如果你在一个普通的 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_modelget_modelsonly_installed 参数不再存在,get_modelseed_cache 参数也不存在。


:setting:`INSTALLED_APPS`的管理命令和顺序

当多个应用程序提供同名的管理命令时,Django 从 :setting:`INSTALLED_APPS` 中最先出现的应用程序加载命令。 以前的版本从最后一个应用程序加载命令。

这使得管理命令的发现与 Django 的其他部分一致,这些部分依赖于 :setting:`INSTALLED_APPS` 的顺序,例如静态文件、模板和翻译。


ValidationError 构造函数和内部存储

ValidationError 构造函数在接收错误容器作为参数(例如 listErrorList):

  • 它将找到的任何字符串转换为 ValidationError 的实例,然后再将它们添加到其内部存储中。
  • 它不存储给定的容器,而是将其内容复制到自己的内部存储中; 以前,容器本身被添加到 ValidationError 实例并用作内部存储。

这意味着如果您访问 ValidationError 内部存储,例如 error_listerror_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 之间的不兼容。 为了使这些设置同步并防止在使用最少设置测试可重用应用程序时出现弃用警告,SessionMiddlewareAuthenticationMiddlewareMessageMiddleware 从默认值中删除. 这些类仍将包含在 :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 创建的数据库,则需要迁移它以利用此功能。 例如,您可以执行以下操作:

    1. 使用 :djadmin:`dumpdata` 保存您的数据。

    2. 重命名现有的数据库文件(保留作为备份)。

    3. 运行 :djadmin:`migrate` 以创建更新的架构。

    4. 使用 :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 上定义了当前类 上的字段,这只会影响您。

  • SelectDateWidgetrequired 参数已被删除。 这个小部件现在像其他小部件一样尊重表单字段的 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.core.cache.get_cache

django.core.cache.get_cache 已被 django.core.cache.caches 取代。


django.utils.dictconfig/django.utils.importlib

django.utils.dictconfigdjango.utils.importlib 分别是为 2.7 之前的 Python 版本提供的 logging.configimportlib 的副本。 它们已被弃用。


django.utils.module_loading.import_by_path

当前的 django.utils.module_loading.import_by_path 函数捕获 AttributeErrorImportErrorValueError 异常,并重新引发 ImproperlyConfigured。 这种异常屏蔽使得诊断循环导入问题变得不必要地困难,因为它使问题看起来像是来自 Django 内部。 它已被弃用,取而代之的是 import_string()


django.utils.tzinfo

django.utils.tzinfo 提供了两个 tzinfo 子类,LocalTimezoneFixedOffset。 它们已被弃用,取而代之的是 django.utils.timezonedjango.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 并已弃用。

SortedDictinsert()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` 中时提供减少的功能。 在这种情况下,应用加载重构会增加一些限制。 因此,移动了两个对象,并弃用了旧位置:


ModelAdmin 上的 declared_fieldsets 属性

ModelAdmin.declared_fieldsets 已被弃用。 尽管是私有 API,但它将通过常规的弃用路径。 此属性主要由绕过 ModelAdmin.get_fieldsets() 的方法使用,但这被认为是一个错误并已得到解决。


django.contrib.contenttypes重组

由于 django.contrib.contenttypes.generic 定义了与管理和模型相关的对象,因此导入此模块可能会引发意外的副作用。 因此,它的内容被拆分为 contenttypes 子模块,并且 django.contrib.contenttypes.generic 模块已被弃用:


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.IPAddressFielddjango.forms.IPAddressField 字段已被弃用,取而代之的是 django.db.models.GenericIPAddressFielddjango.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

已经强烈建议您使用 GETPOST 而不是 REQUEST,因为前者更明确。 属性 REQUEST 已弃用,将在 Django 1.9 中删除。


django.utils.datastructures.MergeDict 类

MergeDict 的存在主要是为了支持将 POSTGET 参数合并到 WSGIRequest 上的 REQUEST 属性中。 要合并字典,请改用 dict.update()。 类 MergeDict 已弃用,将在 Django 1.9 中删除。


语言代码 zh-cn、zh-tw 和 fy-nl

当前使用的简体中文 zh-cn、繁体中文 zh-tw 和(西)弗里斯兰语 fy-nl 的语言代码已弃用,应替换为语言代码 zh-hans , zh-hantfy。 如果您使用这些语言代码,您应该重命名语言环境目录并更新您的设置以反映这些更改。 弃用的语言代码将在 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 支持已弃用,请改用 SplitDateTimeWidgetSplitDateTimeField


validate

validate 管理命令已弃用,取而代之的是 :djadmin:`check` 命令。


django.core.management.BaseCommand

requires_model_validation 已弃用,取而代之的是新的 requires_system_checks 标志。 如果缺少后一个标志,则使用前一个标志的值。 同时定义 requires_system_checksrequires_model_validation 会导致错误。

check() 方法取代了旧的 validate() 方法。


ModelAdmin 验证器

ModelAdmin.validator_classdefault_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() 的实现。


从 future 库加载 ssi 和 url 模板标签

Django 1.3 引入了 {% load ssi from future %}{% load url from future %} 语法来向前兼容 ssi:ttag:`url` 模板标签。 此语法现已弃用,并将在 Django 1.9 中删除。 您可以简单地删除 {% load ... from future %} 标签。


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_ampersandsclean_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 不再从普通字符串更正为元组。
  • HttpResponseSimpleTemplateResponseTemplateResponserender_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.utilssave_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 混音被移除。