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升级到更新版本 如果正在更新现有项目,则提供指南。
Django2.1支持python 3.5、3.6和3.7。Django2.0是最后一个支持python 3.4的版本。我们 强烈推荐 只有官方支持每个系列的最新版本。
将“查看”权限添加到模型中 Meta.default_permissions . 运行时将自动创建新权限 migrate .
这允许用户以只读方式访问管理员中的模型。 ModelAdmin.has_view_permission() 是新的。实现是向后兼容的,因为不需要为具有“更改”权限的用户分配“查看”权限来编辑对象。
django.contrib.admin¶ModelAdmin.search_fields 现在接受任何查找,如 field__exact .
jquery从2.2.3版升级到3.3.1版。
新的 ModelAdmin.delete_queryset() 方法允许自定义“删除选定对象”操作的删除过程。
现在你可以 override the default admin site .
新的 ModelAdmin.sortable_by 属性与 ModelAdmin.get_sortable_by() 方法允许限制可以在更改列表页中排序的列。
这个 admin_order_field 中元素的属性 ModelAdmin.list_display 现在可以是查询表达式。
新的 ModelAdmin.get_deleted_objects() 方法允许自定义删除视图和“删除所选”操作的删除过程。
这个 actions.html , change_list_results.html , date_hierarchy.html , pagination.html , prepopulated_fields_js.html , search_form.html 和 submit_line.html 模板现在可以 overridden per app or per model (除了全局覆盖)。
管理更改列表和更改表单对象工具现在可以 overridden per app, per model, or globally 具有 change_list_object_tools.html 和 change_form_object_tools.html 模板。
InlineModelAdmin.has_add_permission() 现在将父对象作为第二个位置参数传递, obj .
管理操作现在可以 specify permissions 限制某些用户的可用性。
django.contrib.auth¶createsuperuser 现在提示允许绕过 AUTH_PASSWORD_VALIDATORS 检查。
django.contrib.gis¶新的 GEOSGeometry.buffer_with_style() 方法是的版本 buffer() 允许自定义缓冲区的样式。
OpenLayersWidget 现在基于Openlayers 4.6.5(以前的3.20.1)。
django.contrib.sessions¶增加了 SESSION_COOKIE_SAMESITE 设置以设置 SameSite 会话cookie上的cookie标志。
这个 local-memory cache backend 现在使用的是最近使用最少的(LRU)剔除策略,而不是伪随机的。
新的 touch() 的方法。 low-level cache API 更新缓存键的超时时间。
增加了 CSRF_COOKIE_SAMESITE 设置以设置 SameSite CSRF cookies上的cookie标志。
控件的小部件 ImageField 现在用HTML属性呈现 accept="image/*" .
增加了 get_supported_language_variant() 功能。
区域语言变体的未翻译字符串现在使用通用语言的翻译。例如,未翻译 pt_BR 字符串使用 pt 翻译。
新的 inspectdb --include-views 选项允许为数据库视图创建模型。
这个 BaseCommand 类现在使用自定义帮助格式化程序,以便 --verbosity 或 --settings 最后出现在帮助输出中,为子类命令的选项提供了一个更突出的位置。
添加了对序列化的支持 functools.partialmethod 对象。
为了支持冻结的环境,迁移可以从 .pyc 文件夹。
模型现在可以使用 __init_subclass__() 从 PEP 487 .
A BinaryField 现在可以设置为 editable=True 如果您希望将其包含在模型表单中。
添加了许多新的文本数据库函数: Chr , Left , LPad , LTrim , Ord , Repeat , Replace , Right , RPad , RTrim 和 Trim .
新的 TruncWeek 函数截断 DateField 和 DateTimeField 到一周的星期一。
查询表达式现在可以使用减号求反。
QuerySet.order_by() 和 distinct(*fields) 现在支持使用字段转换。
BooleanField 现在可以是 null=True .这是鼓励的,而不是 NullBooleanField ,未来可能会被废弃。
新的 QuerySet.explain() 方法显示查询集查询的数据库执行计划。
QuerySet.raw() 现在支持 prefetch_related() .
增加了 samesite 参数 HttpResponse.set_cookie() 允许设置 SameSite 饼干标志。
新的 as_attachment 的参数 FileResponse 设置 Content-Disposition 标题,使浏览器询问用户是否要下载文件。 FileResponse 还尝试设置 Content-Type 和 Content-Length 适当情况下的标题。
新的 json_script 过滤器安全地输出一个python对象作为json,包装在 <script> 标记,可用于JavaScript。
附加测试 Client 支持307和308重定向。
测试 Client 现在将请求数据字典序列化为json if content_type='application/json' . 您可以使用测试客户端的 json_encoder 参数。
新的 SimpleTestCase.assertWarnsMessage() 方法是 assertWarnsRegex() .
本节描述第三方数据库后端可能需要的更改。
坚持 PEP 249 ,数据库不支持功能的异常从 NotImplementedError 到 django.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的上游支持将于2018年12月结束。Django2.1支持MySQL5.6及更高版本。
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> 使用时 RadioSelect 和 CheckboxSelectMultiple 具有 MultiWidget , the wrap_label 上下文变量现在显示为每个选项的属性。例如,在自定义 input_option.html 模板,更改 {{% if wrap_label %}} 到 {{% if widget.wrap_label %}} .
使用新的“查看”权限,当用户没有更改权限时,现有的自定义管理表单可能会引发错误,因为表单可能访问不存在的字段。通过重写解决此问题 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-Cookie 的 Expires 指令更改为跟随 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环境中工作,可能需要删除它们。
vbl.使用 None 作为一名 django.contrib.postgres.fields.JSONField 查找值现在匹配具有指定键和空值的对象,而不是不具有该键的对象。
管理CSS类 field-box 已重命名为 fieldBox 以防止与指定给名为“box”的模型字段的类冲突。
因为管理员 actions.html , change_list_results.html , date_hierarchy.html , pagination.html , prepopulated_fields_js.html , search_form.html 和 submit_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 取而代之的是。
这个 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中删除。
这些功能已达到其折旧周期的末尾,并在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 设置被删除。 CommonMiddleware 和 django.utils.cache.patch_response_headers() 不再设置etags。
这个 Model._meta.has_auto_field 属性被删除。
url() 对正则表达式组中的内联标志的支持 ((?i) , (?L) , (?m) , (?s) 和 (?u) 被删除。
支持 Widget.render() 没有的方法 renderer 参数已删除。
5月 28, 2025