Django:6.0 有哪些新特性
Source: Hacker News
2025-12-03

Django 6.0 已于今天发布,开启了这款深受喜爱、已有 20 年历史的 Python Web 框架的又一个发布周期。它带来了马赛克般的新特性,众多贡献者共同完成,其中一些我也很高兴参与其中。下面是我从发行说明中挑选的亮点。
使用 django-upgrade 升级
如果你要将项目从 Django 5.2 或更早版本升级,试试我的工具 django-upgrade。它会自动把旧的 Django 代码更新为使用新特性,修复弃用警告,并包含针对 Django 6.0 的五个修复器。(有一天我会在有精力和时间时提议把它正式纳入 Django 项目…)
模板局部(Template partials)
Django 6.0 有四个头条特性,我们将在介绍其他值得注意的改动之前先讲这个:
Django 模板语言现在支持模板局部(template partials),使得在模板文件中封装并复用小的命名片段更加容易。
局部是由新标签 {% partialdef %} 和 {% endpartialdef %} 标记的模板片段。它们可以在同一模板内部复用,也可以单独渲染。
在同一模板中复用局部
{% 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 %}
只要在同一文件中发现自己重复写模板代码,就可以使用这种模式。因为局部可以使用变量,它们还能帮助去除具有不同数据的相似控件的重复。
单独渲染局部
{% 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 片段。
历史
htmx 是此功能的主要动机,正如其创建者 Carson Gross 在跨框架评测文章中所倡导的。使用局部有助于在模板内部保持“行为局部性”,通过避免模板文件蔓延,简化编写、调试和维护。
Django 对模板局部的支持最初由 Carlton Gibson 在django‑template‑partials 包中实现,该包仍可用于旧版 Django。将其集成到 Django 本身是今年的 Google Summer of Code 项目,由学生 Farhan Ali 完成,Carlton 担任导师,详见Ticket #36410。你可以在Farhan 的回顾博客文章中了解更多开发过程。特别感谢 Farhan 的编写、Carlton 的指导,以及 Natalia Bidart、Nick Pope 和 Sarah Boyce 的审阅!
任务框架(Tasks framework)
下一个头条特性:
Django 现在内置了 任务框架(Tasks framework),用于在 HTTP 请求‑响应周期之外运行代码。这使得将发送邮件或处理数据等工作卸载到后台工作者成为可能。
后台任务长期是 Web 应用的常见需求,但 Django 以前没有内置解决方案,开发者只能依赖第三方包,如 Celery 或 Django Q2。全新的任务框架提供了统一的 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)
# …
执行任务
目前,Django 不包含生产就绪的任务后端。提供了两个用于开发和测试的后端: