Django:6.0 新特性 – Adam Johnson

发布: (2025年12月10日 GMT+8 04:33)
6 min read

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 依赖第三方方案,如 CeleryDjango 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 包含生产就绪的任务后端。提供了两个用于开发和测试的后端:

  • ImmediateBackend – 同步运行任务,阻塞直至任务完成。
    文档
  • DummyBackend – 当任务被加入队列时不执行任何操作,但可以稍后检查,适用于测试。
    文档

未来的发布可能会加入官方后端,或与流行的第三方运行器集成。

Back to Blog

相关文章

阅读更多 »

Django:6.0 有哪些新特性

2025-12-03 !https://adamj.eu/tech/assets/2025-12-03-django-mosaic.webp Django 6.0 已于今日发布 https://www.djangoproject.com/weblog/2025/dec/03/django-60-r...