
Django4.1 新特点
2022 年 8 月 3 日
欢迎来到 Django 4.1!
这些发行说明涵盖了新功能,以及从 Django 4.0 或更早版本升级时需要注意的一些向后不兼容的更改。我们已经 开始了一些功能的弃用过程。
如果您要更新现有项目,请参阅如何将 Django 升级到更新版本指南。
Python 兼容性¶
Django 4.1 支持 Python 3.8、3.9 和 3.10。我们强烈推荐并且仅官方支持每个系列的最新版本。
视图子类现在可以定义异步 HTTP 方法处理程序:
import asyncio
from django.http import HttpResponse
from django.views import View
class AsyncView(View):
async def get(self, request, *args, **kwargs):
# Perform view logic using await.
await asyncio.sleep(1)
return HttpResponse("Hello async world!")
QuerySet现在为所有数据访问操作提供了一个异步接口。它们按照现有的同步操作命名,但带有a前缀,例如acreate()、aget()等。
新接口允许您编写异步代码,而无需将 ORM 操作包装在sync_to_async():
async for author in Author.objects.filter(name__startswith="A"):
book = await author.books.afirst()
请注意,在这个阶段,底层数据库操作保持同步,并且正在将异步支持下推到 SQL 编译器中,并集成异步数据库驱动程序。新的异步查询集接口目前 sync_to_async()为您封装了必要的操作,并将允许您的代码随着 ORM 的发展利用异步支持的发展。
Check、 unique和选项 中exclusion定义 的 约束Meta.constraints现在 在模型 验证期间 被 检查.
为了帮助用户使用屏幕阅读器和其他辅助技术, 此版本提供了新的基于表单模板。这些提供比旧模板更易于访问的导航,并且能够正确地将相关控件(例如单选列表)分组到字段集中。
推荐使用新模板,它将成为从 Django 5.0 输出表单(如在模板中)时的默认表单呈现样式。{{ form }}
为了便于采用新的输出样式,默认表单和表单集模板现在可以通过 FORM_RENDERER设置在项目级别进行配置。
新的CSRF_COOKIE_MASKED过渡设置允许指定是否屏蔽 CSRF cookie。
CsrfViewMiddleware不再像 DOM 中的 CSRF 令牌那样屏蔽 CSRF cookie。如果要将同一项目的多个实例升级到 Django 4.1,则应在转换期间设置 CSRF_COOKIE_MASKED为True,以便与旧版本的 Django 兼容。一旦过渡到 4.1 完成,您就可以停止覆盖 CSRF_COOKIE_MASKED.
此设置在此版本中已弃用,并将在 Django 5.0 中删除。
django.contrib.admin¶
django.contrib.auth¶
django.contrib.gis¶
django.contrib.postgres¶
django.contrib.sitemaps¶
django.contrib.staticfiles¶
数据库后端¶
Forms¶
用于在转换为字符串时呈现表单的默认模板,例如在模板中,现在可以通过设置为 提供的类在项目级别进行配置。{{ form }}form_template_nameFORM_RENDERER
Form.template_name现在是延迟到渲染器的属性,但可以用字符串值覆盖以指定每个表单类的模板名称。
类似地,用于渲染表单集的默认模板可以通过匹配的 formset_template_name渲染器属性来指定。
新的div.html表单模板、引用 Form.template_name_div属性和匹配Form.as_div() 方法使用 HTML元素呈现表单。
建议使用这种新的输出样式而不是现有的 as_table(),as_p()和as_ul()样式,因为模板实现
为了顺利采用新的输出样式,提供了两个过渡表单渲染器类: django.forms.renderers.DjangoDivFormRenderer和 django.forms.renderers.Jinja2DivFormRenderer,分别用于 Django 和 Jinja2 模板后端。
例如:
FORM_RENDERER = "django.forms.renderers.DjangoDivFormRenderer"
一旦输出样式是默认的,从 Django 5.0 开始,这些过渡渲染器将被弃用,以便在 Django 6.0 中删除。FORM_RENDERER那时可以删除该 声明。
如果新的输出样式不适合您的项目,您应该定义一个渲染器子类来指定 您所需的样式,并进行form_template_name相应 的设置。formset_template_nameFORM_RENDERER
例如,对于 使用的
输出样式as_p(),您可以将表单渲染器设置定义form_template_name为 "django/forms/p.html"和formset_template_nameto "django/forms/formsets/p.html"。
新的允许通过新的参数 legend_tag()在标签中呈现字段标签。
和 允许阻止新对象创建的新edit_only参数。modelformset_factory()inlineformset_factory()
Media的js和cssclass 属性 现在允许使用可散列对象,而不仅仅是路径字符串,只要这些对象实现该方法(通常在使用装饰器装饰时)。__html__()html_safe()
新的BoundField.use_fieldset和Widget.use_fieldset 属性有助于识别其输入应分组在 a
error_messages参数 现在允许通过传递 和键BaseFormSet为无效数量的表单自定义错误消息。'too_few_forms''too_many_forms'
IntegerField, FloatField, DecimalField现在可以选择接受一个step_size 参数。这用于设置stepHTML 属性,并在表单提交时进行验证。
Internationalization¶
管理命令¶
Migrations¶
Models¶
请求和响应¶
Security¶
Signals¶
Templates¶