Django 2.1发行说明

2018年8月1日

欢迎来到Django 2.1!

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

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

python兼容性

Django2.1支持python 3.5、3.6和3.7。Django2.0是最后一个支持python 3.4的版本。我们 强烈推荐 只有官方支持每个系列的最新版本。

Django 2.1的新功能

模型“查看”权限

将“查看”权限添加到模型中 Meta.default_permissions . 运行时将自动创建新权限 migrate .

这允许用户以只读方式访问管理员中的模型。 ModelAdmin.has_view_permission() 是新的。实现是向后兼容的,因为不需要为具有“更改”权限的用户分配“查看”权限来编辑对象。

有两个 backwards incompatible considerations .

次要特征

django.contrib.admin

django.contrib.auth

django.contrib.gis

django.contrib.sessions

隐藏物

CSRF

形式

  • 控件的小部件 ImageField 现在用HTML属性呈现 accept="image/*" .

国际化

  • 增加了 get_supported_language_variant() 功能。

  • 区域语言变体的未翻译字符串现在使用通用语言的翻译。例如,未翻译 pt_BR 字符串使用 pt 翻译。

管理命令

  • 新的 inspectdb --include-views 选项允许为数据库视图创建模型。

  • 这个 BaseCommand 类现在使用自定义帮助格式化程序,以便 --verbosity--settings 最后出现在帮助输出中,为子类命令的选项提供了一个更突出的位置。

迁徙

  • 添加了对序列化的支持 functools.partialmethod 对象。

  • 为了支持冻结的环境,迁移可以从 .pyc 文件夹。

模型

请求和响应

  • 补充 HttpRequest.get_full_path_info() .

  • 增加了 samesite 参数 HttpResponse.set_cookie() 允许设置 SameSite 饼干标志。

  • 新的 as_attachment 的参数 FileResponse 设置 Content-Disposition 标题,使浏览器询问用户是否要下载文件。 FileResponse 还尝试设置 Content-TypeContent-Length 适当情况下的标题。

模板

  • 新的 json_script 过滤器安全地输出一个python对象作为json,包装在 <script> 标记,可用于JavaScript。

测验

2.1中的向后不兼容更改

数据库后端API

本节描述第三方数据库后端可能需要的更改。

  • 坚持 PEP 249 ,数据库不支持功能的异常从 NotImplementedErrordjango.db.NotSupportedError .

  • 更名为 allow_sliced_subqueries 数据库功能标志 allow_sliced_subqueries_with_in .

  • DatabaseOperations.distinct_sql() 现在需要额外的 params 参数,并返回SQL和参数的元组,而不是SQL字符串。

  • DatabaseFeatures.introspected_boolean_field_type 从方法更改为属性。

django.contrib.gis

  • 拆下了对Spatialite 4.0的支持。

放弃了对MySQL5.5的支持

MySQL5.5的上游支持将于2018年12月结束。Django2.1支持MySQL5.6及更高版本。

放弃了对PostgreSQL 9.3的支持

PostgreSQL 9.3的上游支持将于2018年9月结束。Django 2.1支持PostgreSQL 9.4及更高版本。

远离的 BCryptPasswordHasher 从默认值 PASSWORD_HASHERS 设置

如果您在Django 1.4或1.5(之前 BCryptSHA256PasswordHasher 在django 1.6中添加),您可能有一些密码使用 BCryptPasswordHasher 哈舍。

你可以检查一下情况是否是这样的:

from django.contrib.auth import get_user_model

User = get_user_model()
User.objects.filter(password__startswith="bcrypt$$")

如果要继续允许使用这些密码,则必须定义 PASSWORD_HASHERS 设置(如果尚未设置)并包括 'django.contrib.auth.hashers.BCryptPasswordHasher' .

感动 wrap_label 小部件模板上下文变量

弥补 <label> 使用时 RadioSelectCheckboxSelectMultiple 具有 MultiWidget , the wrap_label 上下文变量现在显示为每个选项的属性。例如,在自定义 input_option.html 模板,更改 {{% if wrap_label %}}{{% if widget.wrap_label %}} .

SameSite cookies

用来做饼干的 django.contrib.sessionsdjango.contrib.messages 和Django的CSRF保护现在设置 SameSite 旗到 Lax 默认情况下。尊重此标志的浏览器不会在跨源请求时发送这些cookie。如果您依赖于旧行为,请设置 SESSION_COOKIE_SAMESITE 和/或 CSRF_COOKIE_SAMESITE 设置为 None .

新模型“查看”权限的注意事项

自定义管理表单需要考虑只查看案例

使用新的“查看”权限,当用户没有更改权限时,现有的自定义管理表单可能会引发错误,因为表单可能访问不存在的字段。通过重写解决此问题 ModelAdmin.get_form() 并检查用户是否具有“更改”权限,如果没有,则返回默认表单:

class MyAdmin(admin.ModelAdmin):
    def get_form(self, request, obj=None, **kwargs):
        if not self.has_change_permission(request, obj):
            return super().get_form(request, obj, **kwargs)
        return CustomForm

新的默认视图权限可能允许对管理视图进行不必要的访问

如果您对表单的代码名具有自定义权限 view_<modelname> ,管理员中的新视图权限处理将允许视图访问这些模型的变更列表和详细信息页。如果这是不需要的,您必须更改您的自定义权限代码名。

其他

  • 支持的最低版本 mysqlclient 从1.3.3增加到1.3.7。

  • 移除sqlite<3.7.15的支架。

  • 日期格式 Set-CookieExpires 指令更改为跟随 RFC 7231#section-7.1.1.1 而不是Netscape的cookie标准。日期中存在连字符,如 Tue, 25-Dec-2018 22:26:13 GMT 被移除。除了那些不解析新格式的过时浏览器之外,这种变化应该只是表面的。

  • allowed_hosts 现在是私有API的必需参数 django.utils.http.is_safe_url() .

  • 这个 multiple 属性由 SelectMultiple 小部件现在使用HTML5布尔语法而不是XHTML multiple="multiple" .

  • 表单小部件呈现的HTML不再包含空元素上的右斜杠,例如 <br> . 这在XHTML中是不兼容的,尽管一些小部件已经使用了HTML5的一些方面,例如布尔属性。

  • 价值 SelectDateWidget 的空选项从0更改为空字符串,这主要需要在比较HTML的测试中进行一些调整。

  • User.has_usable_password() 以及 is_password_usable() 函数不再返回 False 如果密码是 None 或者一个空字符串,或者如果密码使用了不在 PASSWORD_HASHERS 设置。这种未记录的行为在Django1.6中是一种回归,并阻止具有此类密码的用户请求密码重置。审核代码以确认这些API的使用不依赖于旧的行为。

  • 因为迁移现在从加载 .pyc 文件,如果您在混合的python 2和python 3环境中工作,可能需要删除它们。

  • 使用 None 作为一个 django.contrib.postgres.fields.JSONField 查找值现在匹配具有指定键和空值的对象,而不是没有键的对象。

  • 管理CSS类 field-box 已重命名为 fieldBox 以防止与指定给名为“box”的模型字段的类冲突。

  • 因为管理员 actions.htmlchange_list_results.htmldate_hierarchy.htmlpagination.htmlprepopulated_fields_js.htmlsearch_form.htmlsubmit_line.html 模板现在可以根据应用程序或模型被覆盖,您可能需要使用为其他目的而编写的那些名称重命名现有模板。

  • QuerySet.raw() 现在像常规查询集一样缓存其结果。使用 iterator() 如果你不想要缓存。

  • 数据库路由器 allow_relation() 在更多情况下调用方法。写得不正确的路由器可能需要相应地更新。

  • 在运行管理命令之前,翻译将不再停用。如果自定义命令要求停用翻译(例如,将未翻译的内容插入数据库),请使用新的 @no_translations decorator .

  • 管理命令不再允许 --settings--pythonpath 参数。

  • 私人 django.db.models.sql.constants.QUERY_TERMS 常量被删除。这个 get_lookup()get_lookups() 方法 Lookup Registration API 可能是合适的替代品。相比于 QUERY_TERMS 常量,它们还允许您的代码解释已注册的任何自定义查找。

  • 与兼容 py-bcrypt 被移除,因为它没有得到维护。使用 bcrypt 取而代之的是。

2.1中不推荐的功能

其他

  • 这个 ForceRHR 为了支持新的 ForcePolygonCW 功能。

  • django.utils.http.cookie_date() 被否决,赞成 http_date() ,采用最新的RFC格式。

  • {{% load staticfiles %}}{{% load admin_static %}} 被否决,赞成 {{% load static %}} 工作原理相同。

  • django.contrib.staticfiles.templatetags.static() 被否决,赞成 django.templatetags.static.static() .

  • 支持 InlineModelAdmin.has_add_permission() 不接受的方法 obj 因为第二个位置参数将在django 3.0中删除。

2.1中删除的功能

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

  • contrib.auth.views.login()logout()password_change()password_change_done()password_reset()password_reset_done()password_reset_confirm()password_reset_complete() 被移除。

  • 这个 extra_context 参数 contrib.auth.views.logout_then_login() 被移除。

  • django.test.runner.setup_databases() 被移除。

  • django.utils.translation.string_concat() 被移除。

  • django.core.cache.backends.memcached.PyLibMCCache 不再支持传球 pylibmc 行为设置作为的顶级属性 OPTIONS .

  • 这个 host 参数 django.utils.http.is_safe_url() 被移除。

  • 在呈现 {{% include %}} 模板标记已删除。

  • DatabaseIntrospection.get_indexes() 被移除。

  • 这个 authenticate() 身份验证方法后端需要 request 作为第一个位置参数。

  • 这个 django.db.models.permalink() 修饰符已移除。

  • 这个 USE_ETAGS 设置被删除。 CommonMiddlewaredjango.utils.cache.patch_response_headers() 不再设置etags。

  • 这个 Model._meta.has_auto_field 属性被删除。

  • url() 对正则表达式组中的内联标志的支持 ((?i)(?L)(?m)(?s)(?u) 被删除。

  • 支持 Widget.render() 没有的方法 renderer 参数已删除。