Django:6.0 有哪些新特性

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

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 以前没有内置解决方案,开发者只能依赖第三方包,如 CeleryDjango 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 包含生产就绪的任务后端。提供了两个用于开发和测试的后端:

  • ImmediateBackend – 同步运行任务,阻塞直至任务完成。
    文档

  • DummyBackend – 当任务被入队时不执行任何操作,但可供后续检查;适用于测试。
    文档

Back to Blog

相关文章

阅读更多 »