Django 1.9发行说明

2015年12月1日

欢迎来到Django 1.9!

这些发行说明涵盖了 new features 以及一些 backwards incompatible changes 从django 1.8或更旧版本升级时,您需要注意。我们已经 dropped some features 已经到了他们的折旧周期结束,我们已经 begun the deprecation process for some features .

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

python兼容性

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

Django1.8系列是最后一个支持Python3.2和3.3的系列。

Django 1.9的新功能

在事务提交后执行操作

新的 on_commit() 钩子允许在成功提交数据库事务后执行操作。这对于发送通知电子邮件、创建排队任务或使缓存无效等任务很有用。

此功能来自 django-transaction-hooks 包已经集成到Django中。

密码验证

Django现在提供密码验证,以帮助防止用户使用弱密码。验证集成在包含的密码更改和重置表单中,并且很容易集成到任何其他代码中。验证由一个或多个在新的 AUTH_PASSWORD_VALIDATORS 设置。

Django中包含四个验证器,它们可以强制使用最小长度,将密码与用户名等用户属性进行比较,确保密码不完全是数字,或者检查常见密码的包含列表。您可以组合多个验证器,并且一些验证器具有自定义配置选项。例如,您可以选择提供常用密码的自定义列表。每个验证器都提供一个帮助文本来向用户解释其需求。

默认情况下,不会执行任何验证并接受所有密码,因此如果不设置 AUTH_PASSWORD_VALIDATORS ,您将看不到任何变化。在使用默认值创建的新项目中 startproject 模板,启用一组简单的验证器。要在包含的项目身份验证表单中启用基本验证,可以设置,例如:

AUTH_PASSWORD_VALIDATORS = [
    {
        "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator",
    },
    {
        "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator",
    },
    {
        "NAME": "django.contrib.auth.password_validation.CommonPasswordValidator",
    },
    {
        "NAME": "django.contrib.auth.password_validation.NumericPasswordValidator",
    },
]

密码验证 了解更多详细信息。

基于类的视图的权限混合

Django现在和Mixins一起发货 AccessMixinLoginRequiredMixinPermissionRequiredMixinUserPassesTestMixin 提供 django.contrib.auth.decorators 用于基于类的视图。这些混音是从 django-braces 项目。

Django和 django-braces 但是,实现:

  • 这个 raise_exception 属性只能是 TrueFalse . 不支持自定义异常或可调用项。

  • 这个 handle_no_permission() 方法不采用 request 参数。当前请求可用于 self.request .

  • 习俗 test_func() 属于 UserPassesTestMixin 不采取 user 参数。当前用户可用于 self.request.user .

  • 这个 permission_required 属性支持一个字符串(定义一个权限)或一个字符串列表/元组(定义多个权限),这些字符串需要满足才能授予访问权限。

  • 新的 permission_denied_message 属性允许将消息传递到 PermissionDenied 例外。

新造型 contrib.admin

管理运动现代,平面设计与新的SVG图标,看起来完美的HIDPI屏幕。它仍然为 YUI's A-grade 浏览器。较旧的浏览器可能会经历不同程度的优雅降级。

并行运行测试

这个 test 命令现在支持 --parallel 在多个进程中并行运行项目测试的选项。

每个进程都有自己的数据库。您必须确保不同的测试用例不访问相同的资源。例如,接触文件系统的测试用例应该创建一个临时目录供自己使用。

默认情况下,此选项为Django自己提供的测试套件启用:

  • 操作系统支持它(除了Windows以外的所有操作系统)

  • 数据库后端支持它(除了Oracle之外的所有内置后端)

次要特征

django.contrib.admin

  • 管理视图现在有 model_adminadmin_site 属性。

  • 管理更改视图的URL已更改(位于 /admin/<app>/<model>/<pk>/ 默认,现在位于 /admin/<app>/<model>/<pk>/change/ )这不会影响您的应用程序,除非您有硬编码的管理URL。在这种情况下,将这些链接替换为 reversing admin URLs 相反。请注意,为了向后兼容,旧的URL仍然会重定向到新的URL,但在将来的版本中可能会删除它。

  • ModelAdmin.get_list_select_related() 已添加以允许更改 select_related() 基于请求在管理员的变更列表查询中使用的值。

  • 这个 available_apps 已将列出当前用户可用应用程序的上下文变量添加到 AdminSite.each_context() 方法。

  • AdminSite.empty_value_displayModelAdmin.empty_value_display 已添加以覆盖管理更改列表中空值的显示。还可以自定义每个字段的值。

  • 添加了jquery事件 when an inline form is added or removed 在“更改表单”页上。

  • 时间选择器小部件包括一个“6 p.m”选项,用于保持每6小时有一个预定义选项的一致性。

  • javascript slug生成现在支持罗马尼亚字符。

django.contrib.admindocs

  • 的模型部分 admindocs 现在还描述了采用参数而不是忽略参数的方法。

django.contrib.auth

  • pbkdf2密码散列器的默认迭代计数增加了20%。这种向后兼容的更改不会影响子类化的用户 django.contrib.auth.hashers.PBKDF2PasswordHasher 更改默认值。

  • 这个 BCryptSHA256PasswordHasher 现在将更新密码 rounds 属性已更改。

  • AbstractBaseUserBaseUserManager 被移到新的 django.contrib.auth.base_user 模块,以便在不包括 django.contrib.auth 在里面 INSTALLED_APPS (这样做在旧版本中引发了一个拒绝警告,Django 1.9不再支持此操作)。

  • 的权限参数 permission_required() 接受所有类型的iterables,而不仅仅是list和tuples。

  • 新的 PersistentRemoteUserMiddleware 使其可以使用 REMOTE_USER 对于只在登录页面而不是会话中的每个请求上填充头的设置。

  • 这个 django.contrib.auth.views.password_reset() 视图接受 extra_email_context 参数。

django.contrib.contenttypes

django.contrib.gis

  • 所有 GeoQuerySet 方法已被弃用并替换为 equivalent database functions . 一旦在代码中替换了遗留方法,您甚至应该能够删除 GeoManager 从支持GIS的类。

  • gdal接口现在支持基于文件和内存的实例化 GDALRaster objects 从原始数据。已添加栅格属性(如投影或像素值)的设置器。

  • 对于Postgis用户,新的 RasterField 允许 storing GDALRaster objects . 它支持在保存模型时自动创建和重新投影空间索引。它还不支持空间查询。

  • 新的 GDALRaster.warp() 方法允许通过指定目标栅格属性(例如原点、宽度、高度或像素大小等)来扭曲栅格。

  • 新的 GDALRaster.transform() 方法允许通过指定目标将栅格转换为不同的空间参考系统 srid .

  • 新的 GeoIP2 类允许使用MaxMind的geolite2数据库,其中包括对IPv6地址的支持。

  • 小部件中包含的默认Openlayers库版本已从2.13更新为2.13.1。

django.contrib.postgres

django.contrib.sessions

  • 会议模式和 SessionStore 类的 dbcached_db 后端被重构以允许在其基础上构建自定义数据库会话后端。见 扩展数据库支持的会话引擎 了解更多详细信息。

django.contrib.sites

  • get_current_site() 现在处理案件 request.get_host() 收益率 domain:port ,例如 example.com:80 . 如果查找失败,因为主机与数据库中的记录不匹配,并且主机有端口,则会删除该端口,并仅使用域部分重试查找。

django.contrib.syndication

  • 已添加对每个馈送项的多个附件的支持。如果在一个RSS源上定义了多个附件,则会将异常作为RSS源引发,与Atom源不同,每个提要项不支持多个附件。

隐藏物

  • django.core.cache.backends.base.BaseCache 现在有一个 get_or_set() 方法。

  • django.views.decorators.cache.never_cache() 现在发送更具说服力的邮件头(添加 no-cache, no-store, must-revalidateCache-Control )更好地防止缓存。这在Django 1.8.8中也增加了。

CSRF

数据库后端

  • PostgreSQL后端 (django.db.backends.postgresql_psycopg2 )也可作为 django.db.backends.postgresql . 旧名称将继续用于向后兼容。

文件存储

形式

  • ModelForm 接受新 Meta 选项 field_classes 自定义字段类型。见 覆盖默认字段 有关详细信息。

  • 现在可以指定表单字段的呈现顺序 field_order 属性 field_order 构造函数参数,或 order_fields() 方法。

  • 表单前缀不仅可以在实例化表单时在表单类内指定。见 表单的前缀 有关详细信息。

  • 现在你可以 specify keyword arguments 要传递给窗体集中窗体的构造函数的。

  • SlugField 现在接受一个 allow_unicode 参数允许在段塞中使用Unicode字符。

  • CharField 现在接受 strip 用于除去前导空格和尾随空格的输入数据的参数。因为这默认为 True 这与以前的版本不同。

  • 表单域现在支持 disabled 参数,允许浏览器禁用字段小部件显示。

  • 现在可以通过重写字段的 get_bound_field() 方法。

通用视图

国际化

  • 这个 django.views.i18n.set_language() 立即正确查看重定向到 translated URLs ,如果有。

  • 这个 django.views.i18n.javascript_catalog() 如果在同一页上多次使用不同的配置,则View现在可以正常工作。

  • 这个 django.utils.timezone.make_aware() 函数得到一个 is_dst 用于帮助解决DST转换期间不明确时间的参数。

  • 现在可以使用getText支持的区域设置变量。这些通常用于可以用不同脚本编写的语言,例如拉丁语和西里尔文(例如 be@latin

  • 增加了 django.views.i18n.json_catalog() 视图以帮助在Django翻译后构建自定义客户端i18n库。它返回包含翻译目录、格式设置和复数规则的JSON对象。

  • 增加了 name_translated 属性返回的对象 get_language_info 模板标签。还添加了相应的模板筛选器: language_name_translated .

  • 您现在可以运行 compilemessages 从项目的根目录中,它将找到由创建的所有应用程序消息文件 makemessages .

  • makemessages 现在呼叫 xgettext 每个区域设置目录一次,而不是每个可翻译文件一次。这加快了本地化构建的速度。

  • blocktrans 支持使用 asvar .

  • 有两种新语言可供选择:哥伦比亚西班牙语和苏格兰盖尔语。

管理命令

  • 新的 sendtestemail 命令允许您发送一封测试电子邮件,以便轻松确认通过Django发送的电子邮件是否正常工作。

  • 以提高所生成SQL代码的可读性 sqlmigrate ,为每个迁移操作生成的SQL代码前面都有该操作的说明。

  • 这个 dumpdata 命令输出现在是确定顺序的。而且,当 --output 选项已指定,它还显示终端中的进度条。

  • 这个 createcachetable 命令现在有一个 --dry-run 用于打印而不是执行SQL的标志。

  • 这个 startapp 命令创建 apps.py 文件。因为它不使用 default_app_config (a discouraged API )必须指定应用程序配置的路径,例如 'polls.apps.PollsConfig'INSTALLED_APPS 以供使用(而不是 'polls'

  • 使用PostgreSQL后端时, dbshell 命令可以使用设置文件中的密码连接到数据库(而不是要求手动输入密码)。

  • 这个 django 包可以作为脚本运行,即 python -m django ,其行为与 django-admin .

  • 具有 --noinput 现在也可以选择 --no-input 作为该选项的别名。

迁徙

  • 初始迁移现在标记为 initial = True 类属性,允许 migrate --fake-initial 更容易检测初始迁移。

  • 添加了对序列化的支持 functools.partialLazyObject 实例。

  • 供应时 None 作为一个值 MIGRATION_MODULES ,Django将该应用程序视为不带迁移的应用程序。

  • 在应用迁移时,当使用详细程度2或更高版本运行迁移时显示的“呈现模型状态”步骤现在只计算已应用迁移的状态。正在应用的迁移的模型状态是按需生成的,大大减少了所需的内存量。

    但是,当取消应用迁移时,这种改进是不可用的,因此仍然需要对中间迁移状态进行预计算和存储。

    这一改进还要求Django不再支持混合迁移计划。混合计划由一系列迁移组成,其中一些正在应用,另一些则未应用。这从未得到官方支持,也从未有过支持此行为的公共API。

  • 这个 squashmigrations 命令现在支持指定从中挤压迁移的开始迁移。

模型

  • QuerySet.bulk_create() 现在在代理模型上工作。

  • 数据库配置获得 TIME_ZONE 用于与在本地时间存储日期时间且不支持时区的数据库交互的选项 USE_TZTrue .

  • 增加了 RelatedManager.set() 方法创建的相关经理 ForeignKeyGenericForeignKeyManyToManyField .

  • 这个 add() 反向外键上的方法现在具有 bulk 允许执行一个查询的参数,而不管添加的对象数是多少,而不是每个对象一个查询。

  • 增加了 keep_parents 参数到 Model.delete() 只允许删除使用多表继承的模型中的子级数据。

  • Model.delete()QuerySet.delete() 返回删除的对象数。

  • 添加了一个系统检查以防止同时定义 Meta.orderingorder_with_respect_to 在同一型号上。

  • Date and time 查找可以与其他查找(例如 exactgtlt 等)。例如: Entry.objects.filter(pub_date__month__gt=6) .

  • 现在支持时间查找(小时、分钟、秒) TimeField 用于所有数据库后端。Django 1.7中添加了对非sqlite后端的支持,但未记录。

  • 您可以指定 output_field 的参数 Avg 聚合以便聚合非数字列,例如 DurationField .

  • 增加了 date 查找到 DateTimeField 只允许按日期部分查询字段。

  • 增加了 GreatestLeast 数据库函数。

  • 增加了 Now 数据库函数,返回当前日期和时间。

  • Transform 现在是的子类 Func() 允许 Transform 在表达式的右侧使用,就像正则表达式一样 Func 这允许注册一些数据库函数,比如 LengthLowerUpper 作为转换。

  • SlugField 现在接受一个 allow_unicode 参数允许在段塞中使用Unicode字符。

  • 在中添加了对引用注释的支持 QuerySet.distinct() .

  • connection.queries 在sqlite上显示带有替换参数的查询。

  • Query expressions 现在可以在创建新模型实例时使用 save()create()bulk_create() .

请求和响应

模板

  • 使用创建的模板标记 simple_tag() 帮助程序现在可以使用 as 参数。

  • 增加了一个 Context.setdefault() 方法。

  • 这个 django.template 已添加记录器,其中包含以下消息:

    • A DEBUG 缺少上下文变量的级别消息。

    • A WARNING 在呈现期间引发的未捕获异常的级别消息 {{% include %}} 当调试模式关闭时(有帮助,因为 {{% include %}} 停止异常并返回空字符串)。

  • 这个 firstof 模板标记支持使用“as”将输出存储在变量中。

  • Context.update() 现在可以用作上下文管理器。

  • Django模板加载器现在可以递归地扩展模板。

  • 现在,调试页模板的后期分析包括安装的每个引擎的输出。

  • Debug page integration 添加了自定义模板引擎。

  • 这个 DjangoTemplates 后端通过模板获得了显式注册库和内置函数的能力 OPTIONS .

  • 这个 timesincetimeuntil 在给定大时间跨度的情况下,对过滤器进行了改进以处理闰年。

  • 这个 include 标记现在在模板呈现期间缓存解析的模板对象,加快了在循环等位置的重用。

测验

  • 增加了 json() 方法来测试客户端响应,以将响应主体作为JSON授予访问权限。

  • 增加了 force_login() 测试客户端的方法。使用此方法模拟用户登录站点的效果,同时跳过的身份验证和验证步骤 login() .

URLs

  • 现在在URL模式中允许使用正则表达式lookaround断言。

  • 现在可以使用 app_name 包含的模块或对象的属性。也可以通过将两个元组(<list of patterns>,<application namespace>)作为第一个参数传递给 include() .

  • 添加了常见URL模式错误的系统检查。

验证器

1.9中的向后不兼容更改

警告

除了本节概述的更改外,请务必查看 1.9中删除的功能 对于已达到折旧周期结束并因此被移除的功能。如果您没有在取消预测时间线内更新给定功能的代码,则删除该功能可能会显示为向后不兼容的更改。

数据库后端API

  • 一些新的测试依赖于后端对列默认值进行自省的能力(将结果返回为 Field.default )您可以设置 can_introspect_default 数据库功能到 False 如果你的后端没有实现这一点。您可能希望查看Django包含的后端实现,以供参考。 (#24245

  • 在db-api模块级别注册全局适配器或转换器,以处理 datetime 对于不支持时区的数据库,不鼓励将值作为查询参数传递或作为查询结果返回。它可能与其他类库发生冲突。

    向添加时区的推荐方法 datetime 从数据库中获取的值是为 DateTimeField 在里面 DatabaseOperations.get_db_converters() .

    这个 needs_datetime_string_cast 数据库功能已删除。设置它的数据库后端必须注册一个转换器,如上所述。

  • 这个 DatabaseOperations.value_to_db_<type>() 方法已重命名为 adapt_<type>field_value() 镜像 convert_<type>field_value() 方法。

  • 使用新的 date 查找,第三方数据库后端可能需要实现 DatabaseOperations.datetime_cast_date_sql() 方法。

  • 这个 DatabaseOperations.time_extract_sql() 方法已添加。它调用现有的 date_extract_sql() 方法。此方法被sqlite后端重写,以便将时间查找(小时、分钟、秒)添加到 TimeField 第三方数据库后端可能需要。

  • 这个 DatabaseOperations.datetime_cast_sql() 方法(不要与 DatabaseOperations.datetime_cast_date_sql() 已删除。这个方法在1.0之前就已经在Oracle上对日期进行了格式化,但多年来没有被任何核心后端覆盖,也没有在Django的代码或测试中被调用。

  • 为了支持测试并行化,必须实现 DatabaseCreation._clone_test_db() 方法与集合 DatabaseFeatures.can_clone_databases = True . 你可能需要调整 DatabaseCreation.get_test_db_clone_settings() .

作为元组的默认设置现在是列表

中的默认设置 django.conf.global_settings 是列表和元组的组合。以前是元组的所有设置现在都是列表。

is_usable 模板加载器上的属性已删除

Django模板加载器以前需要一个 is_usable 要定义的属性。如果在模板设置中配置了加载器并且此属性为 False ,则加载程序将被静默忽略。实际上,这只被鸡蛋加载器用来检测是否 setuptools 已经安装了。这个 is_usable 属性,则鸡蛋加载器将在运行时失败,如果 setuptools 未安装。

基于文件系统的模板加载器捕获更具体的异常

当使用 filesystem.Loaderapp_directories.Loader 模板加载器,Django的早期版本引发了 TemplateDoesNotExist 如果模板源存在但无法读取,则出错。在许多情况下都可能发生这种情况,例如Django没有打开文件的权限,或者模板源是一个目录。现在,Django只会在模板源不存在时消除异常。所有其他情况都会导致 IOError 被提升。

HTTP重定向不再强制到绝对URI

相对重定向不再转换为绝对URI。 RFC 2616 要求 Location 重定向响应中的头为绝对URI,但已被取代 RFC 7231 允许相对URI进入 Location ,认识到用户代理的实际实践,几乎所有这些都支持它们。

因此,预期的URL传递到 assertRedirects 通常不再包含URL的方案和域部分。例如, self.assertRedirects(response, 'http://testserver/some-url/') 应替换为 self.assertRedirects(response, '/some-url/') (除非重定向特别包含绝对URL)。

在罕见的情况下,您需要旧的行为(发现与古代版本的Apache with mod_scgi 这将相对重定向解释为“内部重定向”),您可以通过编写自定义中间件来恢复它:

class LocationHeaderFix(object):
    def process_response(self, request, response):
        if "Location" in response:
            response["Location"] = request.build_absolute_uri(response["Location"])
        return response

已放弃对PostgreSQL 9.0的支持

PostgreSQL 9.0的上游支持于2015年9月结束。因此,django 1.9将9.1设置为它正式支持的最小PostgreSQL版本。

放弃对Oracle 11.1的支持

对Oracle 11.1的上游支持于2015年8月结束。因此,Django1.9将11.2设置为它正式支持的最低Oracle版本。

模板 LoaderOriginStringOrigin 被移除

在Django的早期版本中,当模板引擎以debug as初始化时 True ,的实例 django.template.loader.LoaderOrigindjango.template.base.StringOrigin 被设置为模板对象的原始属性。这些课程被合并成 Origin 现在,无论引擎调试设置如何,都会设置。为了实现最小程度的向后兼容性,旧类名将保留为新类名的别名。 Origin 在Django 2.0之前上课。

对默认日志记录配置的更改

为了便于编写自定义日志配置,Django的默认日志配置不再定义 django.requestdjango.security 伐木工人。相反,它定义了一个 django 记录器,在 INFO 级别,有两个处理程序:

  • console :过滤 INFO 水平,只有在 DEBUG=True .

  • mail_admins :过滤 ERROR 水平,只有在 DEBUG=False .

如果您没有覆盖django的默认日志记录,您应该看到行为的最小变化,但是您可能会看到一些新的日志记录到 runserver 例如,控制台。

如果您要覆盖Django的默认日志记录,您应该检查配置如何与新的默认值合并。

HttpRequest 错误报告中的详细信息

显示 HttpRequest 每次它作为堆栈帧变量出现在HTML版本的调试页和错误电子邮件中。因此,HTTP请求现在将显示与其他变量相同的标准表示形式。 (repr(request) )因此, ExceptionReporterFilter.get_request_repr() 方法和未登记的 django.http.build_request_repr() 功能被删除。

修改了电子邮件文本版本的内容,以提供与Ajax请求相同结构的回溯。回溯细节由 ExceptionReporter.get_traceback_text() 方法。

删除日期时间的时区感知全局适配器和转换器

Django不再注册用于管理时区信息的全局适配器和转换器 datetime 作为查询参数发送到数据库或从查询结果中的数据库中读取的值。此更改会影响满足以下所有条件的项目:

  • 这个 USE_TZ 设置是 True .

  • 数据库是sqlite、mysql、oracle或不支持时区的第三方数据库。如果有疑问,您可以检查 connection.features.supports_timezones .

  • 代码在ORM外部查询数据库,通常使用 cursor.execute(sql, params) .

如果你路过,注意 datetime 这些查询的参数,您应该将其转换为使用UTC的原始日期时间:

from django.utils import timezone

param = timezone.make_naive(param, timezone.utc)

如果不这样做,转换将像在早期版本中那样执行(带有拒绝警告),直到django 1.11。Django2.0不会执行任何转换,这可能导致数据损坏。

如果你在读书 datetime 从结果中得出的价值观,他们将是幼稚的而不是清醒的。你可以补偿如下:

from django.utils import timezone

value = timezone.make_aware(value, timezone.utc)

如果通过ORM查询数据库,即使使用 raw() 查询。ORM负责管理时区信息。

模板标记模块在配置模板时导入

这个 DjangoTemplates 后端现在在实例化时对已安装的模板标记模块执行发现。此更新使库能够通过 'libraries' 关键 OPTIONS 定义一个 DjangoTemplates 后端。模板标记模块中的导入或语法错误现在在实例化时早期失败,而不是在模板具有 {{% load %}} 首先编译标记。

django.template.base.add_to_builtins() 被移除

虽然它是一个私有的API,但通常使用的项目 add_to_builtins() 使模板标记和过滤器不使用 {{% load %}} 标签。此API已正式化。项目现在应该通过 'builtins' 关键 OPTIONS 定义一个 DjangoTemplates 后端。

simple_tag now wraps tag output in conditional_escape

通常,模板标记不会自动转义其内容,并且此行为是 documented . 对于标签类 inclusion_tag ,这不是问题,因为包含的模板将执行自动转义。为了 assignment_tag() ,当输出用作模板中的变量时,将对其进行转义。

用于 simple_tag 但是,很容易以错误的HTML和可能的XSS漏洞结束。例如::

@register.simple_tag(takes_context=True)
def greeting(context):
    return "Hello {0}!".format(context["request"].user.first_name)

在旧版本的Django中,这将是一个XSS问题,因为 user.first_name 没有逃脱。

在django 1.9中,这是固定的:如果模板上下文 autoescape=True 设置(默认),然后 simple_tag 将标记函数的输出包装为 conditional_escape() .

修复你的 simple_tag S,最好采用以下做法:

  • 生成HTML的任何代码都应该使用模板系统或 format_html() .

  • 如果A的输出 simple_tag 需要逃运行,使用 escape()conditional_escape() .

  • 如果您完全确定要从受信任的源(例如,存储管理员输入的HTML的CMS字段)输出HTML,则可以使用 mark_safe() .

无论在django 1.9+或更早版本上运行,遵循这些规则的标签都是正确和安全的。

Paginator.page_range

Paginator.page_range 现在是迭代器而不是列表。

在1.8之前的Django版本中, Paginator.page_range 返回A list 在python 2和a中 range 在Python 3中。Django1.8始终返回一个列表,但迭代器更高效。

依赖于的现有代码 list 通过将迭代器转换为 list 使用 list() .

隐性的 QuerySet __in 查找删除

在早期版本中,查询如下:

Model.objects.filter(related_id=RelatedModel.objects.all())

将隐式转换为::

Model.objects.filter(related_id__in=RelatedModel.objects.all())

导致类似SQL的 "related_id IN (SELECT id FROM ...)" .

这个隐含的 __in 不再发生,所以“in”SQL现在为“=”,并且如果子查询返回多个结果,那么至少有些数据库会抛出一个错误。

contrib.admin 浏览器支持

管理员不再支持Internet Explorer 8及以下版本,因为这些浏览器已达到使用寿命。

支持Internet Explorer 6和7的CSS和图像已被删除。PNG和GIF图标已替换为SVG图标,Internet Explorer 8及更早版本不支持SVG图标。

嵌入在管理中的jQuery库已从1.11.2版升级到2.1.4版。JQuery 2.x具有与jQuery 1.x相同的API,但不支持Internet Explorer 6、7或8,从而允许更好的性能和更小的文件大小。如果您需要支持IE8并且还必须使用最新版本的Django,您可以使用您自己的版本覆盖管理员的jQuery副本,方法是创建一个Django应用程序,其结构如下:

app/static/admin/js/vendor/
    jquery.js
    jquery.min.js

SyntaxError 安装Django时 setuptools 5.5.x

使用安装Django 1.9或1.9.1时 setuptools 5.5.x,您将看到:

Compiling django/conf/app_template/apps.py ...
  File "django/conf/app_template/apps.py", line 4
    class {{ camel_case_app_name }}Config(AppConfig):
          ^
SyntaxError: invalid syntax

Compiling django/conf/app_template/models.py ...
  File "django/conf/app_template/models.py", line 1
    {{ unicode_literals }}from django.db import models
                             ^
SyntaxError: invalid syntax

忽略这些错误是安全的(Django仍将安装得很好),但您可以通过升级来避免它们 setuptools 升级到更新的版本。如果您正在使用pip,您可以使用以下命令升级pip python -m pip install -U pip 它也将升级 setuptools 。在更高版本的Django中解决了这一问题,如 Django 1.9.2发行说明

其他

  • 中的jquery静态文件 contrib.admin 已经被转移到 vendor/jquery 子目录。

  • 为管理员更改列表中的空列显示的文本 list_display 单元格已从更改 (None) (或其翻译的等效物)至 - (破折号)

  • django.http.responses.REASON_PHRASESdjango.core.handlers.wsgi.STATUS_CODE_TEXT 已经被移除了。请改用Python的标准库: http.client.responses 对于Python3和 httplib.responses 对于Python2。

  • ValuesQuerySetValuesListQuerySet 已被删除。

  • 这个 admin/base.html 模板不再设置 window.__admin_media_prefix__window.__admin_utc_offset__ . javascript中使用该值构建绝对URL的图像引用已移动到CSS中,以便于自定义。UTC偏移量存储在 <body> 标签。

  • CommaSeparatedIntegerField 已对验证进行了优化,以禁止类似的值 ','',1''1,,2' .

  • 表单初始化已从 ProcessFormView.get() 新方法 FormMixin.get_context_data() 方法。如果您重写了 get_context_data() 不调用的方法 super() .

  • 对Postgis 1.5的支持已被放弃。

  • 这个 django.contrib.sites.models.Site.domain 字段已更改为 unique .

  • 为了强制测试隔离,默认情况下不允许在 SimpleTestCase 测试了。您可以通过设置 allow_database_queries 类属性到 True 在你的测试课上。

  • ResolverMatch.app_name 已更改为包含嵌套命名空间的完整命名空间路径。为了与…保持一致 ResolverMatch.namespace ,空值现在是空字符串,而不是 None .

  • 为了加强安全性,会话密钥必须至少为8个字符。

  • 私人职能 django.utils.functional.total_ordering() 已删除。它包含一个 functools.total_ordering() 在2.7.3之前的python版本中出现错误。

  • XML序列化(通过 dumpdata 或联合框架)用于输出接收到的任何字符。现在,如果要序列化的内容包含XML 1.0标准中不允许的任何控制字符,则序列化将失败,并返回 ValueError .

  • CharField 现在默认情况下,去掉前导空格和尾随空格的输入。可以通过设置新的 strip 参数 False .

  • 翻译并使用两个或多个连续百分号的模板文本,例如 "%%" ,可能有新的 msgid 之后 makemessages 运行(很可能翻译标记为模糊)。新的 msgid 将被标记 "#, python-format" .

  • 如果既不 request.current_app 也不 Context.current_app 被设置为 url 模板标记现在将使用当前请求的命名空间。集合 request.current_appNone 如果不想使用名称空间提示。

  • 这个 SILENCED_SYSTEM_CHECKS 现在设置将使所有级别的消息静音。以前,消息 ERROR 级别或更高级别被打印到控制台。

  • 这个 FlatPage.enable_comments 字段从中删除 FlatPageAdmin 因为它没有被应用程序使用。如果您的项目或第三方应用程序使用它, create a custom ModelAdmin 把它加回来。

  • 的返回值 setup_databases() 第一个论点是 teardown_databases() 改变。他们曾经是 (old_names, mirrors) 元组。现在他们只是第一个项目, old_names .

  • 默认情况下 LiveServerTestCase 尝试在8081-8179范围内查找可用端口,而不仅仅是尝试端口8081。

  • 系统检查 ModelAdmin 现在检查实例而不是类。

  • 由于性能原因,用于应用混合迁移计划的私有API已被删除。混合计划包括一个迁移列表,其中一些正在应用,而另一些则未应用。

  • 中的相关模型对象描述符类 django.db.models.fields.related (私有API)从 related 模块到 related_descriptors 并更名如下:

    • ReverseSingleRelatedObjectDescriptor is ForwardManyToOneDescriptor

    • SingleRelatedObjectDescriptor is ReverseOneToOneDescriptor

    • ForeignRelatedObjectsDescriptor is ReverseManyToOneDescriptor

    • ManyRelatedObjectsDescriptor is ManyToManyDescriptor

  • 如果实现自定义 handler404 视图,它必须返回带有HTTP 404状态代码的响应。使用 HttpResponseNotFound 或通行证 status=404HttpResponse . 否则, APPEND_SLASH 无法正常工作 DEBUG=False .

1.9中不推荐的功能

assignment_tag()

Django 1.4增加了 assignment_tag 帮助器,以便于创建存储模板变量结果的模板标记。这个 simple_tag() 助手获得了同样的能力,使得 assignment_tag 过时的。使用的标签 assignment_tag 应该更新以使用 simple_tag .

{{% cycle %}} 带逗号分隔参数的语法

这个 cycle 标记支持以前的django版本中较低的旧语法:

{% cycle row1,row2,row3 %}

它的解析导致了当前语法的错误,因此在Django1.10中,对旧语法的支持将在加速的降级之后被删除。

ForeignKeyOneToOneField on_delete 论点

为了提高对级联模型删除的认识,需要 on_delete 的参数 ForeignKeyOneToOneField 在Django 2.0中需要。

更新模型和现有迁移以显式设置参数。因为默认值是 models.CASCADE ,添加 on_delete=models.CASCADE 对所有 ForeignKeyOneToOneField 这不是一个不同的选择。如果不关心与Django旧版本的兼容性,也可以将其作为第二个位置参数传递。

Field.rel 变化

Field.rel 它的方法和属性已经改变以匹配相关的字段api。这个 Field.rel 属性重命名为 remote_field 它的许多方法和属性要么被更改要么被重命名。

这些更改的目的是为关系字段提供文档化的API。

GeoManagerGeoQuerySet 自定义方法

所有习俗 GeoQuerySet 方法 (area()distance()gml() ,…)已被注释中的等效地理表达式替换(请参见新功能)。因此需要设置自定义 GeoManager 到现在,支持地理信息系统的模型已经过时了。只要代码不调用任何不推荐使用的方法,就可以简单地删除 objects = GeoManager() 从你的模型线条。

模板加载器API已更改

Django模板加载器已更新,以允许递归模板扩展。此更改需要新的模板加载器API。老年人 load_template()load_template_sources() 方法现在已弃用。可以找到有关新API的详细信息 in the template loader documentation .

传递3元组或 app_nameinclude()

将元组作为参数传递给的实例命名空间部分 include() 已被替换为通过 namespace 参数 include() . 例如::

polls_patterns = [
    url(...),
]

urlpatterns = [
    url(r"^polls/", include((polls_patterns, "polls", "author-polls"))),
]

变成::

polls_patterns = (
    [
        url(...),
    ],
    "polls",
)  # 'polls' is the app_name

urlpatterns = [
    url(r"^polls/", include(polls_patterns, namespace="author-polls")),
]

这个 app_name 参数 include() 已被替换为传递2元组(如上所述),或者传递带有 app_name 属性(如下)。如果 app_name 是以这种新的方式设置的, namespace 不再需要参数。它将默认为 app_name . 例如,教程中的URL模式从以下位置更改为:

mysite/urls.py
urlpatterns = [url(r"^polls/", include("polls.urls", namespace="polls")), ...]

到:

mysite/urls.py
urlpatterns = [
    url(r"^polls/", include("polls.urls")),  # 'namespace="polls"' removed
    ...,
]
polls/urls.py
app_name = "polls"  # added
urlpatterns = [...]

这一变化也意味着包括 AdminSite 实例已弃用。相反,通过 admin.site.urls 直接到 django.conf.urls.url()

urls.py
from django.conf.urls import url
from django.contrib import admin

urlpatterns = [
    url(r"^admin/", admin.site.urls),
]

如果设置实例命名空间,则需要URL应用程序命名空间

在过去,没有应用程序命名空间的实例命名空间与应用程序命名空间具有相同的用途,但如果存在同名的应用程序命名空间,则无法反转模式。指定实例命名空间的include要求包含的urlconf设置应用程序命名空间。

current_app 参数到 contrib.auth 意见

中的所有视图 django.contrib.auth.views 具有以下结构:

def view(request, ..., current_app=None, ...):

    ...

    if current_app is not None:
        request.current_app = current_app

    return TemplateResponse(request, template_name, context)

截至Django 1.8, current_app 设置在 request 对象。为了保持一致性,这些视图将要求调用者设置 current_apprequest 而不是在单独的参数中传递它。

django.contrib.gis.geoip

这个 django.contrib.gis.geoip2 模块取代 django.contrib.gis.geoip . 新模块提供了一个类似的API,只是它不提供传统的geoip-python-api兼容性方法。

其他

  • 这个 weak 参数 django.dispatch.signals.Signal.disconnect() 已被弃用,因为它没有效果。

  • 这个 check_aggregate_support() 方法 django.db.backends.base.BaseDatabaseOperations 已弃用,将在Django 2.0中删除。更一般的 check_expression_support() 应该改为使用。

  • django.forms.extras 被贬低。你可以找到 SelectDateWidget 在里面 django.forms.widgets (或者简单地 django.forms 相反。

  • 私有API django.db.models.fields.add_lazy_relation() 被贬低。

  • 这个 django.contrib.auth.tests.utils.skipIfCustomUser() decorator已弃用。随着django 1.6中的测试发现更改,对 django.contrib 应用程序不再作为用户项目的一部分运行。因此, @skipIfCustomUser 修饰符不再需要装饰测试 django.contrib.auth .

  • 如果你定制了一些 error handlers ,不推荐使用只有一个请求参数的视图签名。现在视图也应该接受一秒钟 exception 位置参数。

  • 这个 django.utils.feedgenerator.Atom1Feed.mime_typedjango.utils.feedgenerator.RssFeed.mime_type 属性已弃用,取而代之的是 content_type .

  • Signer 如果使用了无效分隔符,则会发出警告。这将成为Django 1.10的一个例外。

  • django.db.models.Field._get_val_from_obj() 被否决,赞成 Field.value_from_object() .

  • django.template.loaders.eggs.Loader 不推荐使用,因为不推荐使用鸡蛋来分发应用程序。

  • 这个 callable_obj 关键字参数 SimpleTestCase.assertRaisesMessage() 被贬低。将可调用项作为位置参数传递。

  • 这个 allow_tags 方法的属性 ModelAdmin 已弃用。使用 format_html()format_html_join()mark_safe() 当构造方法的返回值时。

  • 这个 enclosure 关键字参数 SyndicationFeed.add_item() 被贬低。使用新的 enclosures 接受列表的参数 Enclosure 对象而不是单个对象。

  • 这个 django.template.loader.LoaderOrigindjango.template.base.StringOrigin 用于别名 django.template.base.Origin 被贬低。

1.9中删除的功能

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

  • django.utils.dictconfig 被移除。

  • django.utils.importlib 被移除。

  • django.utils.tzinfo 被移除。

  • django.utils.unittest 被移除。

  • 这个 syncdb 命令被删除。

  • django.db.models.signals.pre_syncdbdjango.db.models.signals.post_syncdb 被移除。

  • 支持 allow_syncdb 数据库上的路由器被删除。

  • 已删除不迁移的应用程序的自动同步。除非通过 migrate --run-syncdb 选择权。

  • 用于不进行迁移的应用程序的SQL管理命令, sqlsqlallsqlclearsqldropindexessqlindexes 被移除。

  • 支持自动加载 initial_data 将删除设备和初始SQL数据。

  • 所有模型都需要在已安装的应用程序中定义,或者声明一个显式的 app_label . 此外,不可能在加载应用程序之前导入它们。尤其是,不可能在应用程序的根包中导入模型。

  • 模型和形式 IPAddressField 被移除。stub字段保持与历史迁移的兼容性。

  • AppCommand.handle_app() 不再支持。

  • RequestSiteget_current_site() 不再可以从 django.contrib.sites.models .

  • 通过 runfcgi 删除管理命令。

  • django.utils.datastructures.SortedDict 被移除。

  • ModelAdmin.declared_fieldsets 被移除。

  • 这个 util 提供向后兼容性的模块将被删除:

    • django.contrib.admin.util

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

    • django.db.backends.util

    • django.forms.util

  • ModelAdmin.get_formsets 被移除。

  • 引入向后兼容垫片来重命名 BaseMemcachedCache._get_memcache_timeout() 方法到 get_backend_timeout() 被移除。

  • 这个 --natural-n 选项 dumpdata 被移除。

  • 这个 use_natural_keys 的参数 serializers.serialize() 被移除。

  • 私有API django.forms.forms.get_declared_fields() 被移除。

  • 使用 SplitDateTimeWidget 具有 DateTimeField 被移除。

  • 这个 WSGIRequest.REQUEST 属性被删除。

  • django.utils.datastructures.MergeDict 被移除。

  • 这个 zh-cnzh-tw 删除语言代码。

  • 内部 django.utils.functional.memoize() 被移除。

  • django.core.cache.get_cache 被移除。

  • django.db.models.loading 被移除。

  • 无法再将可调用参数传递给查询集。

  • BaseCommand.requires_model_validation 以利于 requires_system_checks . 管理员验证程序由管理员检查替换。

  • 这个 ModelAdmin.validator_classdefault_validator_class 属性被删除。

  • ModelAdmin.validate() 被移除。

  • django.db.backends.DatabaseValidation.validate_field 以利于 check_field 方法。

  • 这个 validate 删除管理命令。

  • django.utils.module_loading.import_by_path 以利于 django.utils.module_loading.import_string .

  • ssiurl 模板标记将从 future 模板标记库。

  • django.utils.text.javascript_quote() 被移除。

  • 数据库测试设置作为数据库设置中的独立项,前缀为 TEST_ 不再支持。

  • 这个 cache_choices 选择权 ModelChoiceFieldModelMultipleChoiceField 被移除。

  • 的默认值 RedirectView.permanent 属性已从更改 TrueFalse .

  • django.contrib.sitemaps.FlatPageSitemap 以利于 django.contrib.flatpages.sitemaps.FlatPageSitemap .

  • 私有API django.test.utils.TestTemplateLoader 被移除。

  • 这个 django.contrib.contenttypes.generic 模块被移除。