Django:6.0 新特性 – Adam Johnson
Source: Hacker News

Django 6.0 已于 今天发布,开启了这个已有 20 年历史的 Python Web 框架的又一个发布周期。它带来了一系列新特性,众多贡献者共同完成,其中一些是我亲自参与的。下面是我从 发行说明 中挑选的亮点。
Upgrade with help from django-upgrade
如果你正在将项目从 Django 5.2 或更早的版本升级,试试我的工具 django-upgrade(文档)。它会自动把旧的 Django 代码更新为使用新特性,并修复弃用警告,其中包括针对 Django 6.0 的五个 fixers。(有一天我会在有精力和时间的情况下,提议把 django-upgrade 正式纳入 Django 官方项目…)
Template partials
Django 6.0 有四个头条特性,我们先从这个开始:
Django 模板语言现在支持 模板局部(template partials),让在模板文件中封装并复用小的命名片段变得更容易。
局部(partials)是使用新标签 {% partialdef %} 和 {% endpartialdef %} 标记的模板片段。它们可以在同一模板内部复用,也可以单独渲染。
Reuse partials within the same template
下面的模板定义了一个 filter_controls 局部,并在同一文件中使用了两次:
{% partialdef filter_controls %}
{{ filter_form }}
{% endpartialdef %}
{% partial filter_controls %}
{% for video in videos %}
## {{ video.title }}
…
{% endfor %}
{% partial filter_controls %}
你可以使用 inline 选项简化这种模式,它会在原位渲染定义:
{% partialdef filter_controls inline %}
{{ filter_form }}
{% endpartialdef %}
{% for video in videos %}
## {{ video.title }}
…
{% endfor %}
{% partial filter_controls %}
每当你发现自己在同一文件中重复模板代码时,都可以采用这种模式。因为局部可以使用变量,它们还能帮助去除具有不同数据的相似控件的重复代码。
Render partials in isolation
下面的模板定义了一个 view_count 局部,旨在单独重新渲染。它使用了 inline 选项,这样在渲染完整模板时也会包含该局部。页面使用 htmx(通过我的 django‑htmx 包)定期刷新观看次数。
{% load django_htmx %}
## {{ video.title }}
Your browser does not support the video tag.
{% partialdef view_count inline %}
{{ video.view_count }} views
{% endpartialdef %}
{% htmx_script %}
对应的视图代码:
from django.shortcuts import render
def video(request, video_id):
# …
return render(request, "video.html", {"video": video})
def video_view_count(request, video_id):
# …
return render(request, "video.html#view_count", {"video": video})
video 视图渲染完整模板,而 video_view_count 只渲染 view_count 片段,通过在模板名后追加 #view_count 实现——类似于在 URL 中通过 ID 引用 HTML 片段。
History
该特性受 htmx 启发,正如其创作者 Carson Gross 在 跨框架回顾文章 中所述。Django 对模板局部的支持最初由 Carlton Gibson 在 django‑template‑partials 包 中实现,该包仍可用于旧版 Django。随后在今年的 Google Summer of Code 项目中,由学生 Farhan Ali 完成了向 Django 本身的集成,Carlton 担任导师(见 Ticket #36410)。更多信息请阅读 Farhan 的回顾博客文章。感谢 Farhan、Carlton、Natalia Bidart、Nick Pope 与 Sarah Boyce 的贡献。
Tasks framework
Django 现在内置了 Tasks 框架,用于在 HTTP 请求‑响应周期之外运行代码。这使得将发送邮件、处理数据等工作卸载到后台工作者成为可能。
后台任务是常见需求(例如发送邮件、处理图片、生成报告)。过去 Django 依赖第三方方案,如 Celery 或 Django Q2,这些方案的配置往往较为复杂。
新的 Tasks 框架提供了一个标准 API,用于定义后台任务,供第三方任务运行器执行,从而为生态系统提供了统一的基础。
使用新的 @task 装饰器定义任务:
from django.tasks import task
@task
def resize_video(video_id):
...
使用 Task.enqueue() 将任务加入后台执行队列:
from example.tasks import resize_video
def upload_video(request):
# …
resize_video.enqueue(video.id)
# …
Execute tasks
目前 Django 不包含生产就绪的任务后端。提供了两个用于开发和测试的后端:
未来的发布可能会加入官方后端,或与流行的第三方运行器集成。