Django 1.7发行说明

2014年9月2日

欢迎来到Django 1.7!

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

python兼容性

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

Django1.6系列是最后一个支持python 2.6的系列。Django1.7是第一个支持Python3.4的版本。

这种更改只会影响少数Django用户,因为目前大多数操作系统供应商都将python 2.7或更新版本作为其默认版本。但是,如果您仍在使用python 2.6,则需要坚持使用django 1.6,直到您可以升级python版本。每 our support policy ,django 1.6将继续获得安全支持,直到django 1.8发布。

Django 1.7的新功能

架构迁移

Django现在已经内置了对模式迁移的支持。它允许通过创建表示模型更改的迁移文件来更新、更改和删除模型,这些文件可以在任何开发、分段或生产数据库上运行。

迁移包含在 their own documentation 但一些关键特性是:

  • 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 带有迁移的应用程序不再加载设备;如果要加载应用程序的初始数据,我们建议您为应用程序创建迁移并定义 RunPythonRunSQL 中的操作 operations 迁移的部分。

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

  • 不建议有没有迁移的应用程序依赖于 ForeignKeyManyToManyField 迁移的应用程序。

应用程序加载重构

历史上,Django应用程序与模型紧密相连。一个名为“应用缓存”的单例程序同时处理已安装的应用程序和模型。模型模块被用作许多API中应用程序的标识符。

作为概念 Django applications 成熟后,该代码显示出一些缺陷。它被重构为“应用程序注册表”,模型模块不再具有中心角色,并且可以在其中将配置数据附加到应用程序。

到目前为止,改进包括:

  • 应用程序可以在启动时运行代码,在Django执行任何其他操作之前, ready() 它们的配置方法。

  • 应用程序标签被正确地分配给模型,即使它们是在外部定义的 models.py . 你不必设置 app_label 再明确一点。

  • 可以忽略 models.py 完全如果应用程序没有任何模型。

  • 应用程序可以通过 label 应用程序配置的属性,以解决标签冲突。

  • 应用程序的名称可以在管理员中通过 verbose_name 应用程序配置。

  • 管理员自动调用 autodiscover() 当 Django 开始的时候。因此,您可以从URLCONF中删除该行。

  • Django一开始就导入所有的应用程序配置和模型,通过一个确定性和简单的过程。这样可以更容易地诊断导入问题,如导入循环。

字段子类的新方法

为了帮助增强模式迁移,并在将来的django版本中更容易地添加复合键,可以使用 Field API现在有了一个新的必需方法: deconstruct() .

此方法不接受任何参数,并返回由四个项组成的元组:

  • name :字段在其父模型上的属性名称,或 None 如果它不是模型的一部分

  • path :指向该字段类的一条虚线、python路径,包括类名。

  • args :位置参数,作为列表

  • kwargs :关键字参数,如dict

这四个值允许将任何字段序列化到文件中,并允许安全地复制字段,这两个都是这些新特性的基本部分。

除非编写自定义字段子类,否则此更改不应影响您;如果这样做,则可能需要重新实现 deconstruct() 方法如果子类更改了 __init__ 无论如何。如果您的字段只是继承自内置的Django字段而不重写 __init__ ,无需更改。

如果您确实需要覆盖 deconstruct() ,一个很好的起点是内置的Django油田。 (django/db/models/fields/__init__. py)作为几个字段,包括 DecimalFieldDateField ,重写它并演示如何在超类上调用该方法,以及简单地添加或删除额外的参数。

这还意味着字段的所有参数本身都必须是可序列化的;要查看我们认为是可序列化的,并了解如何使自己的类可序列化,请阅读 migration serialization documentation .

调用定制 QuerySet 方法来自 Manager

在历史上,建议使用可重用模型查询的方法是在自定义的 Manager 类。这种方法的问题是,在第一个方法调用之后,您将返回 QuerySet 实例,无法调用其他自定义管理器方法。

尽管没有文档记录,但通过创建自定义 QuerySet 这样就可以将自定义方法链接起来;但是该解决方案有许多缺点:

  • 习俗 QuerySet 它的自定义方法在第一次调用 values()values_list() .

  • 编写自定义 Manager 仍然需要归还海关 QuerySet 类和在 Manager 必须委托给 QuerySet . 整个过程违反了干燥原则。

这个 QuerySet.as_manager() 类方法现在可以直接 create Manager with QuerySet methods ::

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()

遍历反向关系时使用自定义管理器

现在可以 specify a custom manager 当遍历反向关系时:

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()

新的系统检查框架

我们添加了一个新的 System check framework 用于检测常见问题(如无效模型)并提供解决这些问题的提示。该框架是可扩展的,因此您可以为自己的应用程序和库添加自己的检查。

要执行系统检查,请使用 check 管理命令。此命令替换旧的 validate 管理命令。

管理快捷方式支持时区

管理员中日期和时间输入小部件旁边的“今天”和“现在”快捷方式现在在 current time zone . 以前,他们使用浏览器时区,当浏览器时区与服务器上的当前时区不匹配时,可能会导致保存错误的值。

此外,当浏览器和服务器时区不同时,小部件现在会显示一条帮助消息,以说明如何解释字段中插入的值。

使用数据库光标作为上下文管理器

在Python2.7之前,数据库游标可以用作上下文管理器。特定后端的光标定义了上下文管理器的行为。使用python 2.7更改了magic方法查找的行为,并且不再将光标用作上下文管理器。

Django1.7允许将光标用作上下文管理器。也就是说,可以使用以下内容:

with connection.cursor() as c:
    c.execute(...)

而不是::

c = connection.cursor()
try:
    c.execute(...)
finally:
    c.close()

自定义查找

现在可以为ORM编写自定义查找和转换。自定义查找的工作方式与Django的内置查找(例如 lteicontains )而变换是一个新概念。

这个 django.db.models.Lookup 类提供了一种为模型字段添加查找运算符的方法。例如,可以添加 day_lte 算子 DateFields .

这个 django.db.models.Transform 类允许在最终查找之前转换数据库值。例如,可以编写 year 从字段值中提取年份的转换。转换允许链接。后 year 转换已添加到 DateField 例如,可以对转换值进行过滤 qs.filter(author__birthdate__year__lte=1981) .

有关自定义查找和转换的详细信息,请参阅 custom lookups 文档。

改进 Form 错误处理

Form.add_error()

以前有两种处理表单错误的主要模式:

  • 抬高 ValidationError 从某些功能(例如 Field.clean()Form.clean_<fieldname>()Form.clean() 对于非字段错误。)

  • 摆弄 Form._errors 当在 Form.clean() 或者从“干净”方法之外添加错误(例如直接从视图)。

使用前一种模式非常简单,因为表单可以从错误所属的上下文(即哪个方法引发异常)进行猜测,并自动处理它们。这仍然是在可能的情况下添加错误的规范方法。但是,由于处理边缘案例的负担落在了用户身上,后者非常谨慎且容易出错。

新的 add_error() 方法允许从任何地方向特定表单字段添加错误,而不必担心诸如创建 django.forms.utils.ErrorList 或处理 Form.cleaned_data . 这个新的API取代了操纵 Form._errors 现在变成了一个私有的API。

清理和验证相互依赖的字段 例如,使用 Form.add_error() .

错误元数据

这个 ValidationError 构造函数接受元数据,如错误 codeparams 然后可将其插入错误消息(请参见 饲养 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.ErrorList 以及 ValidationError . 这些用于存储错误字符串的容器现在存储 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。

  • 准备好的几何图形现在也支持 crossesdisjointoverlapstoucheswithin 谓词(如果安装了GEOS 3.3或更高版本)。

django.contrib.messages

django.contrib.redirects

django.contrib.sessions

  • 这个 "django.contrib.sessions.backends.cached_db" 会话后端现在尊重 SESSION_CACHE_ALIAS . 在以前的版本中,它总是使用 default 隐藏物。

django.contrib.sitemaps

django.contrib.sites

django.contrib.staticfiles

django.contrib.syndication

  • 这个 Atom1Feed 联合饲料 updated 元素现在利用 updateddate 而不是 pubdate 允许 published 要包含在源中的元素(依赖于 pubdate

隐藏物

  • 访问中配置的缓存 CACHES 现在可通过 django.core.cache.caches . 这个类似dict的对象为每个线程提供不同的实例。它取代了 django.core.cache.get_cache() 现在已弃用。

  • 如果直接实例化缓存后端,请注意它们不再是线程安全的,因为 django.core.cache.caches 现在每个线程生成不同的实例。

  • 定义 TIMEOUT 论证 CACHES 设置为 None 默认情况下将缓存键设置为“非过期”。以前,只有通过 timeout=None 到缓存后端的 set() 方法。

跨站点请求伪造

  • 这个 CSRF_COOKIE_AGE 设置有助于使用基于会话的CSRF cookie。

电子邮件

  • send_mail() 现在接受一个 html_message 用于发送多部分的参数 text/plaintext/html 电子邮件。

  • SMTP EmailBackend 现在接受 timeout 参数。

文件存储

  • Windows上的文件锁定以前依赖于pywin32包;如果未安装该包,则文件锁定将以静默方式失败。该依赖项已被删除,文件锁定现在在Windows和Unix上以本机方式实现。

文件上传

  • 新的 UploadedFile.content_type_extra 属性包含传递给 content-type 文件上传的头文件。

  • 新的 FILE_UPLOAD_DIRECTORY_PERMISSIONS 设置控制文件上载期间创建的目录的文件系统权限,例如 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安全版本中也进行了此更改。

形式

  • 这个 <label><input> 标记呈现者 RadioSelectCheckboxSelectMultiple 循环切换单选按钮或复选框时,现在包括 forid 属性。每个单选按钮或复选框包括 id_for_label 属性以输出元素的ID。

  • 这个 <textarea> 标记呈现者 Textarea 现在包括一个 maxlength 属性如果 TextField 模型字段具有 max_length .

  • 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 已经被改写以支持更多的继承场景。以前的限制阻止了两者的继承 FormModelForm 同时被移除只要 ModelForm 首先出现在MRO中。

  • 现在可以从 Form 当通过将名称设置为 None .

  • 现在可以为自定义错误消息 ModelFormuniqueunique_for_dateunique_together 约束条件。为了支持 unique_together 或其他 NON_FIELD_ERRORModelForm 现在寻找 NON_FIELD_ERROR 关键在 error_messages 字典 ModelForm 内心 Meta 类。见 considerations regarding model's error_messages 了解更多详细信息。

国际化

  • 这个 django.middleware.locale.LocaleMiddleware.response_redirect_class 属性允许您自定义中间件发出的重定向。

  • 这个 LocaleMiddleware 现在将用户选择的语言与会话密钥一起存储 _language 。只能使用 LANGUAGE_SESSION_KEY 常量。以前,它与密钥一起存储 django_language 以及 LANGUAGE_SESSION_KEY 常量不存在,但为Django保留的键应以下划线开头。为了向后兼容 django_language 仍然是从1.7中读取的。会话将在写入时迁移到新密钥。

  • 这个 blocktrans 标记现在支持 trimmed 选择。此选项将从内容的开头和结尾删除换行符 {% blocktrans %} 标记,替换行首和行尾的任何空格,并使用空格字符将所有行合并为一行。这对于缩进 {% blocktrans %} 标记中的相应条目中没有缩进字符的 .po 文件,这使得翻译过程变得更容易。

  • 当你奔运行 makemessages 从项目的根目录中,任何提取的字符串现在都将自动分发到适当的应用程序或项目消息文件。见 本地化:如何创建语言文件 有关详细信息。

  • 这个 makemessages 命令现在总是将 --previous 命令行标志设置为 msgmerge 命令,将先前翻译的字符串保存在 .po 模糊字符串的文件。

  • 引入了以下设置来调整语言cookie选项: LANGUAGE_COOKIE_AGELANGUAGE_COOKIE_DOMAINLANGUAGE_COOKIE_PATH .

  • 补充 格式本地化 世界语。

管理命令

  • 新的 --no-color 选择权 django-admin 禁用管理命令输出的着色。

  • 新的 dumpdata --natural-foreigndumpdata --natural-primary 选项,以及新的 use_natural_foreign_keysuse_natural_primary_keys 参数的理由 serializers.serialize() ,允许在序列化时使用自然主键。

  • 不再需要提供缓存表名或 --database 选项为 createcachetable 命令。Django从设置文件中获取此信息。如果配置了多个缓存或多个数据库,则会创建所有缓存表。

  • 这个 runserver 司令部得到了几项改进:

    • 在Linux系统上,如果 pyinotify 安装后,当文件更改时,开发服务器将立即重新加载。以前,它每秒轮询文件系统以获取更改。这导致了重新加载之前的小延迟,并缩短了笔记本电脑的电池寿命。

    • 此外,当更新翻译文件时,即在运行之后,开发服务器会自动重新加载。 compilemessages .

    • 所有HTTP请求都会记录到控制台,包括对静态文件或 favicon.ico 以前是过滤掉的。

  • 如果安装了ansicon第三方工具并处于活动状态,管理命令现在可以在Windows下生成语法颜色的输出。

  • collectstatic Windows NT 6(Windows Vista和更新版本)现在支持带symlink选项的命令。

  • 初始SQL数据现在可以更好地工作 sqlparse 已安装了Python库。

    请注意,它已被弃用,取而代之的是 RunSQL 迁移操作,这得益于改进的行为。

模型

  • 这个 QuerySet.update_or_create() 方法已添加。

  • 新的 default_permissions 模型 Meta 选项允许您自定义(或禁用)默认添加、更改和删除权限的创建。

  • 明确的 OneToOneField 对于 多表继承 现在在抽象类中发现。

  • 现在可以避免为 OneToOneField 通过设置 related_name'+' 或者以 '+' .

  • F expressions 支持电力运营商 (**

  • 这个 remove()clear() 相关管理者的方法 ForeignKeyGenericForeignKey 现在接受 bulk 关键字参数,用于控制是否批量执行操作(即使用 QuerySet.update() )默认为 True .

  • 现在可以使用 None 作为 iexact 查找。

  • 现在可以为属性传递一个可调用的值 limit_choices_to 定义一个 ForeignKeyManyToManyField .

  • 调用 only()defer() 关于结果 QuerySet.values() 现在引发一个错误(在此之前,它可能会导致数据库错误或数据不正确)。

  • 您可以使用单个列表来 index_together (而不是列表列表)。

  • 现在允许对参与多对多关系的任何模型具有多个外键的自定义中间模型,前提是通过设置新的 ManyToManyField.through_fields 参数。

  • 将模型实例分配给非关系字段现在将引发错误。在此之前,如果字段接受整数作为输入并接受主键,则此操作将起作用。

  • 整数字段现在根据数据库后端特定的最小值和最大值进行验证 internal_type . 以前的模型字段验证不会阻止保存超出其关联列数据类型范围的值,从而导致完整性错误。

  • 现在可以明确地 order_by() 关系 _id 字段的属性名。

信号

  • 这个 enter 参数已添加到 setting_changed 信号。

  • 现在可以使用 str'app_label.ModelName' 表单——就像相关字段一样——懒散地引用它们的发送者。

模板

  • 这个 Context.push() 方法现在返回一个上下文管理器,该管理器自动调用 pop() 一旦退出 with 语句。此外, push() 现在接受传递给 dict 用于生成新上下文级别的构造函数。

  • 新的 Context.flatten() 方法返回 Context 把它叠成一本平字典。

  • Context 现在可以比较对象是否相等(在内部, Context.flatten() 所以每一个的内部结构 Context 只要它们的扁平版本相同,其堆栈就不重要。

  • 这个 widthratio 模板标记现在接受 "as" 参数来捕获变量中的结果。

  • 这个 include 模板标记现在也将接受 render() 方法(例如 Template )作为一个论点。字符串参数将使用 get_template() 一如既往。

  • 现在可以 include 递归模板。

  • 模板对象现在有一个原点属性集,当 TEMPLATE_DEBUGTrue . 这允许在 django.template 基础设施。

  • TypeError 当在呈现模板期间引发异常时,异常不再消声。

  • 以下函数现在接受 dirs 要重写的列表或元组的参数 TEMPLATE_DIRS

  • 这个 time 过滤器现在接受与时区相关的 format specifiers 'e''O''T''Z' 能够消化 time-zone-aware datetime 执行预期呈现的实例。

  • 这个 cache 标记现在将尝试使用名为“template_fragments”的缓存(如果存在),否则返回使用默认缓存。它现在还接受一个可选的 using 关键字参数来控制它使用的缓存。

  • 新的 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 属性。

  • 用于测试的数据库设置已收集到名为 TEST .

公用事业

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

验证器

  • RegexValidator 现在接受选项 flags 布尔函数 inverse_match 参数。这个 inverse_match 属性确定 ValidationError 当正则表达式模式匹配时应引发 (True )或不匹配 (False ,默认情况下)提供的 value . 这个 flags 属性设置在编译正则表达式字符串时使用的标志。

  • URLValidator 现在接受一个可选的 schemes 允许自定义接受的URI方案(而不是默认值)的参数 http(s)ftp(s)

  • validate_email() 现在接受带有ipv6文本的地址,比如 example@[2001:db8::1] ,如RFC 5321所规定。

1.7中的向后不兼容更改

警告

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

allow_syncdb / allow_migrate

当 Django 还在看的时候 allow_syncdb 方法,即使它们应该重命名为 allow_migrate ,在传递模型到这些方法的过程中存在细微的差异。

对于带有迁移的应用程序, allow_migrate 现在会通过的 historical models 是没有自定义属性、方法或管理器的特殊版本化模型。确定你的 allow_migrate 方法仅引用中的字段或其他项 model._meta .

initial_data

带有迁移的应用程序将不会加载 initial_data 完成迁移后的设备。没有迁移的应用程序将在 migrate 模仿旧的 syncdb 行为,但任何新的应用程序都不会有这种支持。

相反,如果需要,建议您在迁移中加载初始数据(使用 RunPython 操作和您的模型类);这有一个额外的优点,即您的初始数据在每次更改模式时都不需要更新。

另外,像 Django 的其他老朋友一样 syncdb 代码, initial_data 已沿折旧路径启动,将在Django 1.9中删除。

deconstruct() 和可序列化

Django现在要求所有字段类及其所有构造函数参数都是可序列化的。如果以任何方式修改自定义字段中的构造函数签名,则需要实现 deconstruct() 方法;我们通过以下方式扩展了自定义字段文档 instructions on implementing this method

所有字段参数的要求为 serializable 意味着任何正在传递给字段构造函数的自定义类实例(例如自定义存储子类)都需要 deconstruct method defined on them as well 尽管Django提供了一个方便的类修饰器,它将适用于大多数应用程序。

应用程序加载更改

启动顺序

Django1.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 为其中一个而重写 label 那里。然后,您应该在代码引用此应用程序或其带有旧标签的模型的任何位置调整代码。

不能再通过不同的路径导入同一个模型两次。从django 1.6开始,只有手动将目录和子目录放置在 PYTHONPATH . 请参阅 1.4 release notes 用于迁移说明。

您应确保:

  • 所有模型都在中列出的应用程序中定义。 INSTALLED_APPS 或者有明确的 app_label .

  • 模型不会作为加载应用程序的副作用导入。具体来说,您不应该在应用程序的根模块或定义其配置类的模块中导入模型。

Django将在折旧期后执行1.9版的这些要求。

子类化appcommand

亚类 AppCommand 现在必须实现 handle_app_config() 方法而不是 handle_app() . 此方法接收 AppConfig 实例而不是模型模块。

反省应用程序

自从 INSTALLED_APPS 现在除了应用程序模块外,还支持应用程序配置类,您应该查看直接访问此设置的代码并使用应用程序注册表 (django.apps.apps 相反。

应用程序注册表保留了旧应用程序缓存的一些功能。即使应用程序缓存是一个私有API,过时的方法和参数也将通过标准取消预测路径删除,但以下更改立即生效的情况除外:

  • get_model 加薪 LookupError 而不是返回 None 找不到模型时。

  • 这个 only_installed 的参数 get_modelget_models 不再存在,也不再存在 seed_cache 的参数 get_model .

管理命令和命令 INSTALLED_APPS

当多个应用程序提供相同名称的管理命令时,Django将从最先进入的应用程序加载该命令。 INSTALLED_APPS . 以前的版本从最后一个应用程序加载了该命令。

这使得管理命令的发现与Django的其他依赖于 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 .

大多数使用这些私有API的用例现在都包含在新引入的 Form.add_error() 方法:

# 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错误

Django以前的版本中存在一个不一致的问题,即不同的缓存后端如何处理pickle错误。 django.core.cache.backends.locmem.LocMemCache 用于在发生此类错误时自动失败,这与其他后端不一致并导致缓存特定错误。这已在Django 1.7中修复,请参见 #21200 了解更多详细信息。

缓存键现在从请求的绝对URL生成

Django的早期版本使用请求的路径和查询字符串生成缓存键,但不使用方案或主机。如果Django应用程序正在服务多个子域或域,则缓存键可能会发生冲突。在Django1.7中,缓存键随请求的绝对URL而变化,包括方案、主机、路径和查询字符串。例如,缓存键的URL部分现在是从 https://www.example.com/path/to/?key=val 而不是 /path/to/?key=val . django 1.7生成的缓存键与旧版本django生成的键不同。升级到django 1.7之后,对任何先前缓存的URL的第一个请求将是缓存未命中。

经过 NoneManager.db_manager()

在Django的早期版本中,可以使用 db_manager(using=None) 在模型管理器实例上使用默认路由行为获取管理器实例,覆盖任何手动指定的数据库路由。在Django 1.7中,值为 None 传递给数据库管理器将生成一个路由器 保留 任何手动分配的数据库路由--管理器将 not 重置。这对于解决路由信息在联接上的级联方式的不一致性是必要的。见 #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的自动事务模式允许使用它锁定记录,直到下一次写入操作。Django1.6引入了数据库级的自动提交;从那时起,在这样的上下文中执行会使 select_for_update() . 因此,现在假定它是一个错误并引发异常。

之所以进行此更改,是因为这些错误可能是由包含预期全局事务的应用程序(例如 ATOMIC_REQUESTS 设置为 True 或者Django以前的自动提交行为,在没有它们的情况下运行的项目中;而且,这些错误可能表现为数据损坏错误。它也是在 Django 1.6.3制造的。

如果您使用 select_for_update() 在属于的子类的测试类中 TransactionTestCase 而不是 TestCase .

已从默认值中删除contrib中间件 MIDDLEWARE_CLASSES

这个 app-loading refactor 不推荐使用不属于 INSTALLED_APPS 设置。这暴露了默认 INSTALLED_APPSMIDDLEWARE_CLASSES 在全局默认值中 (django.conf.global_settings )为了使这些设置同步并防止在使用最小设置测试可重用应用程序时出现拒绝警告, SessionMiddlewareAuthenticationMiddlewareMessageMiddleware 已从默认值中删除。这些类仍将包含在由 startproject . 大多数项目不会受到此更改的影响,但如果您以前没有声明 MIDDLEWARE_CLASSES 在项目设置和依赖全局默认设置时,应确保新默认值符合项目的需要。您还应该检查是否有任何代码可以访问 django.conf.global_settings.MIDDLEWARE_CLASSES 直接。

其他

  • 这个 django.core.files.uploadhandler.FileUploadHandler.new_file() 方法现在传递了一个附加的 content_type_extra 参数。如果你有一个习惯 FileUploadHandler 那工具 new_file() ,确保它接受此新参数。

  • ModelFormSet 在下列情况下不再删除实例 save(commit=False) 被称为。见 can_delete 有关如何从已删除表单中手动删除对象的说明。

  • 装载空夹具会发出 RuntimeWarning 而不是提高 CommandError .

  • django.contrib.staticfiles.views.serve() 现在将提高 Http404 异常而不是 ImproperlyConfigured 什么时候? DEBUGFalse . 此更改消除了有条件地将视图添加到根urlconf的需要,这反过来使按名称进行反向操作更加安全。它还消除了访问者通过请求不存在或尚未收集的静态文件来生成虚假HTP500错误的能力。

  • 这个 django.db.models.Model.__eq__() 方法现在的定义方式是,当主键匹配时,代理模型的实例与其基础模型被认为是相等的。以前只有完全相同类的实例在主键匹配时被认为是相等的。

  • 这个 django.db.models.Model.__eq__() 方法已更改,因此 Model 没有主键值的实例将被视为不相等(除非它们是相同的实例)。

  • 这个 django.db.models.Model.__hash__() 方法现在将提升 TypeError 在没有主键值的实例上调用时。这样做是为了避免易变 __hash__ 容器中的值。

  • AutoField 现在将使用 AUTOINCREMENT 选项,保证单调递增。这将导致在sqlite上更改主键编号行为,从而与大多数其他SQL数据库保持一致。这只适用于新创建的表。如果您有一个使用旧版本的django创建的数据库,则需要迁移它以利用此功能。例如,可以执行以下操作:

    1. 使用 dumpdata 保存数据。

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

    3. 运行 migrate 创建更新的架构。

    4. 使用 loaddata 导入在(1)中导出的装置。

  • django.contrib.auth.models.AbstractUser 不再定义 get_absolute_url() 方法。返回旧定义 "/users/%s/" % urlquote(self.username) 这是任意的,因为应用程序可以或不可以在 urlpatterns . 定义一个 get_absolute_url() 自定义用户对象上的方法或使用 ABSOLUTE_URL_OVERRIDES 如果你想为你的用户提供一个网址。

  • 静态资产服务功能 django.test.LiveServerTestCase 课程已经简化:现在它只能提供已经存在的内容 STATIC_ROOT 测试运行时。透明地服务于所有静态资产的能力(类似于 DEBUG = True 在开发阶段)被转移到了一个新的阶级 staticfiles 应用程序(实际负责此功能的应用程序): django.contrib.staticfiles.testing.StaticLiveServerTestCase . 换言之, LiveServerTestCase 它的力量不那么强大,但同时魔法也更少。

    基本原理是消除非控制代码对控制应用程序的依赖性。

  • 旧的缓存URI语法(例如 "locmem://" )不再支持。它仍然有效,即使它没有记录或官方支持。如果您仍在使用它,请更新到当前 CACHES 语法。

  • 默认的顺序 Form 继承的字段已更改为遵循正常的python mro。现在,通过反向迭代MRO发现字段,最顶层的类排在最后。只有当您在当前类上定义字段时,依赖默认字段顺序时,这才会影响您。 and 在父母身上 Form .

  • 这个 required 的参数 SelectDateWidget 已删除。这个小部件现在尊重表单域的 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 数据库后端方法现在以自动提交模式执行(除非 AUTOCOMMITFalse )如果维护自定义数据库后端,则应检查该方法。

  • 这个 django.db.backends.BaseDatabaseFeatures.allows_primary_key_0 属性已重命名为 allows_auto_pk_0 更好地描述它。它是 True 对于django中包含的所有数据库后端,mysql除外,它允许使用值为0的主键。它只是禁止 自动增量 值为0的主键。

  • 禁止隐藏父模型中定义的模型字段,因为这会在预期的模型行为中造成歧义。此外,模型继承层次结构中的冲突字段会导致系统检查错误。例如,如果使用多继承,则需要在父模型上定义自定义主键字段,否则将使用默认值 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 参数。

  • 这个 shortcut 视图 django.contrib.contenttypes.views 现在支持协议相关的URL(例如 //example.com

  • GenericRelation 现在支持可选 related_query_name 参数。设置 related_query_name 将相关对象的关系添加回内容类型,以便进行筛选、排序和其他查询操作。

  • 在PostgreSQL上运行测试时, USER 需要对内置的 postgres 数据库。这代替了以前连接到实际非测试数据库的行为。

  • 作为 System check frameworkfields, models, and model managers 全部实施 check() 在检查框架中注册的方法。如果有一个现有方法调用 check() 在其中一个对象上,您需要重命名它。

  • 如上文“次要功能”的“缓存”部分所述,定义 TIMEOUT 论证 CACHES 设置为 None 将缓存键设置为“非过期”。以前,在memcache后端, TIMEOUT 属于 0 将设置非过期密钥,但这与的设置和过期(即无缓存)行为不一致 set("key", "value", timeout=0) . 如果您需要非过期密钥,请更新您的设置以使用 None 而不是 0 因为后者现在也在设置中指定set和expire。

  • 这个 sql* 管理指挥部现在尊重 allow_migrate() 方法 DATABASE_ROUTERS . 如果模型与非默认数据库同步,请使用 --database 获取这些模型的SQL的标志(以前它们总是包含在输出中)。

  • 当输入的utf-8无效时,从URL解码查询字符串现在返回到ISO-8859-1编码。

  • 加上 django.contrib.auth.middleware.SessionAuthenticationMiddleware 对于默认项目模板(仅限1.7.2之前版本),在使用 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 分别是 logging.configimportlib 为2.7之前的python版本提供。他们被否决了。

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 提供统一的访问权限 unittest2 所有Python版本的库。自从 unittest2 成为标准类库的 unittest python 2.7和django 1.7中的模块不再支持旧的python版本,这个模块不再有用。它已被弃用。使用 unittest 相反。

django.utils.datastructures.SortedDict

AS OrderedDict 在python 2.7中添加到标准库, SortedDict 不再需要,已被弃用。

由提供的另外两个不推荐使用的方法 SortedDict (insert()value_for_index() )已被删除。如果您依赖这些方法来改变像表单字段这样的结构,那么现在应该处理这些 OrderedDict 作为不可变对象,并重写它们以更改其内容。

例如,您可能希望重写 MyFormClass.base_fields (尽管此属性不被视为公共API)更改所有字段的顺序 MyFormClass 实例;或者类似地,您可以重写 self.fields 从内部 MyFormClass.__init__() ,以更改特定表单实例的字段。例如(来自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/ . 此错误已被修复,因此Django将搜索 myapp/sql/ 记录在案。在解决了这个问题之后,添加了迁移,这将取消对初始SQL数据的预测。因此,尽管这种变化仍然存在,但由于整个特性将在Django 1.9中被删除,因此取消预测是不相关的。

重组 django.contrib.sites

django.contrib.sites 当它不在时提供的功能会减少 INSTALLED_APPS . 应用程序加载重构在这种情况下添加了一些约束。因此,移动了两个对象,不推荐使用旧位置:

declared_fieldsets attribute on ModelAdmin

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

重组 django.contrib.contenttypes

自从 django.contrib.contenttypes.generic 定义了管理和模型相关的对象,导入此模块可能会触发意外的副作用。因此,它的内容被分成 contenttypes 子模块和 django.contrib.contenttypes.generic 模块已弃用:

syncdb

这个 syncdb 命令已被弃用,取而代之的是 migrate 命令。 migrate 采用与 syncdb 以前经常加上一些,所以只需更改您所调用的名字就可以了,其他的什么都没有。

util modules renamed to utils

以下实例 util.py 在Django代码库中已重命名为 utils.py 为了统一所有的util和utils引用:

  • django.contrib.admin.util

  • django.contrib.gis.db.backends.util

  • django.db.backends.util

  • django.forms.util

get_formsets method on 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,但它将经历正常的降级。

自然键序列化选项

这个 --natural-n 选项 dumpdata 已弃用。使用 dumpdata --natural-foreign 相反。

同样, use_natural_keys 的参数 serializers.serialize() 已弃用。使用 use_natural_foreign_keys 相反。

合并 POSTGET 论证 WSGIRequest.REQUEST

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

django.utils.datastructures.MergeDict

MergeDict 主要用于支持合并 POSTGET 变元为 REQUEST 属性对 WSGIRequest . 要合并词典,请使用 dict.update() 相反。类 MergeDict 已弃用,将在Django 1.9中删除。

语言代码 zh-cnzh-twfy-nl

目前使用的简体中文语言代码 zh-cn ,繁体中文 zh-tw 和(西方)弗莱西 fy-nl 已弃用,应替换为语言代码 zh-hanszh-hantfy 分别。如果使用这些语言代码,则应重命名区域设置目录并更新设置以反映这些更改。不推荐使用的语言代码将在Django 1.9中删除。

django.utils.functional.memoize 功能

该功能 memoize 已弃用,应替换为 functools.lru_cache 装饰器(从Python3.2开始提供)。

Django为旧的python版本提供了这个修饰符的一个后端口,它可以在 django.utils.lru_cache.lru_cache . 不推荐使用的函数将在Django 1.9中删除。

地理站点地图

谷歌已经退出了对地理位置图格式的支持。因此,Django对地理位置图的支持被弃用,将在Django 1.8中删除。

将可调用参数传递给queryset方法

查询集的可调用参数是不可靠的未记录功能。它已被弃用,将在Django 1.9中删除。

可调用参数是在构造查询集而不是在对其进行评估时进行评估的,因此,与将参数传递给查询集之前对参数进行评估相比,此功能没有提供任何好处,并造成混淆,即参数可能是在查询时进行评估的。

ADMIN_FOR 设置

这个 ADMIN_FOR 管理员文档的一部分功能已被删除。您可以在方便时从配置中删除设置。

SplitDateTimeWidget with DateTimeField

SplitDateTimeWidget 支持 DateTimeField 已弃用,请使用 SplitDateTimeWidget 具有 SplitDateTimeField 相反。

validate

这个 validate 管理命令已弃用,取而代之的是 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() .

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

Django 1.3介绍 {{% load ssi from future %}}{{% load url from future %}} 向前兼容的语法 ssiurl 模板标签。此语法现在已弃用,将在Django 1.9中删除。您可以简单地删除 {{% load ... from future %}} 标签。

django.utils.text.javascript_quote

javascript_quote() 中是否存在未记录的函数 django.utils.text . 它在内部使用 javascript_catalog() 视图其实现已更改以使用 json.dumps() 相反。如果依赖此函数从不受信任的字符串提供安全输出,则应使用 django.utils.html.escapejsescapejs 模板筛选器。如果您所需要的只是生成有效的javascript字符串,那么只需使用 json.dumps() .

fix_ampersands utils方法和模板过滤器

这个 django.utils.html.fix_ampersands 方法与 fix_ampersands 模板过滤器被弃用,因为django的标准HTML转义功能已经处理了与符号的转义。将此与 fix_ampersands 可能会导致双重转义,或者,如果假定输出是安全的,则有引入XSS漏洞的风险。随着 fix_ampersandsdjango.utils.html.clean_html 已弃用,是一个未记录的函数,它调用 fix_ampersands . 由于这是一种加速折旧, fix_ampersandsclean_html 将在Django 1.8中移除。

重新组织数据库测试设置

所有数据库设置 TEST_ 前缀已弃用,取而代之的是 TEST 数据库设置中的字典。在Django 1.9之前,将支持旧设置。为了与旧版本的django向后兼容,您可以定义两个版本的设置,只要它们匹配。

FASCGI支持

通过 runfcgi 管理命令将在Django 1.9中删除。请使用wsgi部署您的项目。

移动的对象 contrib.sites

在应用程序加载重构之后,中的两个对象 django.contrib.sites.models 需要移动,因为它们必须在不导入的情况下可用 django.contrib.sites.models 什么时候? django.contrib.sites 未安装。进口 RequestSitedjango.contrib.sites.requestsget_current_site()django.contrib.sites.shortcuts . 旧的进口地点将一直工作到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 为支持新的 custom lookups API .

1.7中删除的功能

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

  • django.utils.simplejson 被移除。

  • django.utils.itercompat.product 被移除。

  • 已安装的应用程序和模板目录不再从普通字符串更正为元组。

  • 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.utils 以及 save_warnings_state() / restore_warnings_state() django.test.*TestCase 被移除。

  • 这个 check_for_test_cookie 方法在 AuthenticationForm 被移除。

  • 版本 django.contrib.auth.views.password_reset_confirm() 支持base36编码的用户ID (django.contrib.auth.views.password_reset_confirm_uidb36 被删除。

  • 这个 django.utils.encoding.StrAndUnicode 混合被移除。