April 2, 2025
欢迎来到Django 5.2!
这些发行说明涵盖 new features ,以及一些 backwards incompatible changes 从Django 5.1或更早版本升级时您应该注意这一点。我们 begun the deprecation process for some features 。
见 如何将Django升级到更新版本 如果正在更新现有项目,则提供指南。
Django 5.2被指定为 long-term support release .它将在发布后至少三年内收到安全更新。对之前的RTS Django 4.2的支持将于2026年4月结束。
Django 5.2支持Python 3.10、3.11、3.12和3.13。我们 highly recommend 并且仅官方支持每个系列的最新版本。
shell
¶的 shell
管理命令现在自动从所有已安装的应用程序导入模型。您可以通过设置 --verbosity
标记为2或更多:
$ python -Wall manage.py shell --verbosity=2
6 objects imported automatically, including:
from django.contrib.admin.models import LogEntry
from django.contrib.auth.models import Group, Permission, User
from django.contrib.contenttypes.models import ContentType
from django.contrib.sessions.models import Session
...\> py -Wall manage.py shell --verbosity=2
6 objects imported automatically, including:
from django.contrib.admin.models import LogEntry
from django.contrib.auth.models import Group, Permission, User
from django.contrib.contenttypes.models import ContentType
from django.contrib.sessions.models import Session
这 behavior can be customized 添加或删除自动导入。
新 django.db.models.CompositePrimaryKey
允许使用由多个字段组成的公钥创建表。
要使用复合公钥,请在定义模型时设置 pk
属性要成为 CompositePrimaryKey
from django.db import models
class Release(models.Model):
pk = models.CompositePrimaryKey("version", "name")
version = models.IntegerField()
name = models.CharField(max_length=20)
看到 复合主键 了解更多详细信息。
BoundField
¶在5.2版本之前,覆盖 Field.get_bound_field()
是使用自定义的唯一选择 BoundField
. Django现在支持指定以下属性来自定义表单渲染:
Form.bound_field_class
在形式层面,并且
Field.bound_field_class
在现场层面。
例如,要自定义 BoundField
的 Form
类别::
from django import forms
class CustomBoundField(forms.BoundField):
custom_class = "custom"
def css_classes(self, extra_classes=None):
result = super().css_classes(extra_classes)
if self.custom_class not in result:
result += f" {self.custom_class}"
return result.strip()
class CustomForm(forms.Form):
bound_field_class = CustomBoundField
name = forms.CharField(
label="Your Name",
max_length=100,
required=False,
widget=forms.TextInput(attrs={"class": "name-input-class"}),
)
email = forms.EmailField(label="Your Email")
当渲染 CustomForm
实例中,包括以下HTML:
<div class="custom">
<label for="id_name">Your Name:</label>
<input type="text" name="name" class="name-input-class" maxlength="100" id="id_name">
</div>
<div class="custom">
<label for="id_email">Your Email:</label>
<input type="email" name="email" maxlength="320" required="" id="id_email">
</div>
看到 定制 BoundField 有关此功能的更多详细信息。
django.contrib.admin
¶django.contrib.admindocs
¶文档字符串中的组件链接现在支持自定义链接文本,格式为 :role:`link text <link>
.看到 :ref:`documentation helpers <admindocs-helpers> 了解更多详细信息。
的 model pages 现在仅限于具有相应查看或更改权限的用户。
django.contrib.auth
¶PBKDF 2密码哈希器的默认迭代计数从870,000增加到1,000,000。
现在使用 a
前置:
Auth后台现在可以提供在调用Expressc auth函数时使用的Expressc实现(例如 aauthenticate()
)以减少上下文切换,从而提高性能。看到 adding an async interface 了解更多详细信息。
的 password validator classes 现在有了新方法 get_error_message()
,可以在子类中重写它以自定义错误消息。
django.contrib.gis
¶GDAL现在支持弯曲几何 CurvePolygon
, CompoundCurve
, CircularString
, MultiSurface
,而且 MultiCurve
经由新的 OGRGeometry.has_curve
财产和 OGRGeometry.get_linear_geometry()
和 OGRGeometry.get_curve_geometry()
方法.
MySQL连接现在默认使用 utf8mb4
字符集,而不是 utf8
,这是不推荐的字符集的别名 utf8mb3
.
Oracle后台现在支持 connection pools ,通过设置 "pool"
在 OPTIONS
数据库配置的一部分。
method_decorator()
现在支持包装非同步视图方法。
二元项 EmailMessage.attachments
和 EmailMultiAlternatives.attachments
现在被命名为二元组,而不是常规二元组。
EmailMultiAlternatives.alternatives
现在是一个已命名的二元组列表,而不是常规二元组。
新的 body_contains()
方法返回布尔值,指示电子邮件中是否包含提供的文本 body
以及所有附加的MBE类型 text/*
替代品.
属性 SafeExceptionReporterFilter.hidden_settings
现在,如果值的名称包括,则将其视为敏感值 AUTH
.
新 ColorInput
表单小部件用于输入颜色 rrggbb
十六进制格式并呈现为 <input type="color" ...>
.某些浏览器支持此输入类型的可视颜色选择器界面。
新 SearchInput
表单小部件用于输入搜索查询并呈现为 <input type="search" ...>
.
新 TelInput
表单小部件用于输入电话号码并呈现为 <input type="tel" ...>
.
新 field_id
论据 ErrorList
允许HTML id
要添加到错误模板中的属性。看到 ErrorList.field_id
有关详细信息
一个 aria_describedby
特性添加到 BoundField
以轻松在模板中使用此HTML属性。
提高屏幕阅读器用户的可访问性 aria-describedby
用于将表单字段与其错误消息关联起来。看到 how form errors are displayed 有关详细信息
新资产对象 Script
可用于将自定义HTML属性添加到表单媒体中的JavaScript。看到 paths as objects 了解更多详细信息。
运行时显示新警告 runserver
,表明不适合生产。可以通过设置 DJANGO_RUNSERVER_HIDE_WARNING
环境变量来 "true"
.
的 makemigrations
和 migrate
命令有一个新 Command.autodetector
要重写的子类属性以使用自定义自动检测器类。
新 BaseCommand.get_check_kwargs()
可以在自定义命令中重写方法以控制系统检查的运行,例如选择进入依赖于数据库的检查。
新运行 AlterConstraint
是一种无操作操作,可以更改约束,而无需删除和重新创建数据库中的约束。
的 SELECT
使用时生成的分句 QuerySet.values()
和 QuerySet.values_list()
现在与引用的公式的指定顺序相匹配。以前,该命令基于一组反直觉的规则,这些规则通过以下方法进行查询组合 QuerySet.union()
不可预测的。
添加了对使用 GeneratedField
.
新 Expression.set_returning
属性指定该运算式包含一个集返回函数,用于强制子查询计算。这对于许多Postgs集合返回函数来说是必要的。
CharField.max_length
不再需要在SQLite上设置,SQLite支持无限 VARCHAR
列.
QuerySet.explain()
现在支持 memory
和 serialize
PostgreSQL 17+上的选项。
新 JSONArray
数据库函数接受字段名称或运算式列表并返回包含这些值的杨森数组。
新 Expression.allows_composite_expressions
属性指定该运算式允许复合运算式(例如)支持 composite primary keys .
新 HttpResponse.text
属性提供的字符串表示 HttpResponse.content
.
新 HttpRequest.get_preferred_type()
方法可用于查询客户端接受的首选媒体类型。
新 preserve_request
论据 HttpResponseRedirect
和 HttpResponsePermanentRedirect
确定是否分别使用了HTTP状态代码302/307或301/308。
新 preserve_request
论据 redirect()
允许指示用户代理在重定向期间使用特定状态代码重新使用HTTP方法和主体。
每种序列化格式现在定义了 Deserializer
类而不是函数,以提高定义时的可扩展性 custom serialization format .
新 simple_block_tag()
装饰器支持创建简单的块标签,该标签可以接受和使用模板的一部分。
Django自定义断言的堆栈框架现在被隐藏。这使得测试失败更容易阅读并使 test --pdb
直接进入失败测试方法。
数据加载自 fixtures
以及通过启用迁移 serialized_rollback=True 现已在期间可用 TransactionTestCase.setUpClass()
.
reverse()
和 reverse_lazy()
现在接受 query
和 fragment
关键字参数,允许分别在生成的URL中添加查询字符串和/或片段标识符。
SafeString
现在返回 NotImplemented
在 __add__
对于非字符串右侧值。这与 str
添加行为并允许 __radd__
如果有的话将使用。
format_html_join()
现在支持获取映射的迭代对象,将其内容作为关键字参数传递给 format_html()
.
本节描述第三方数据库后端可能需要的更改。
新 Model._is_pk_set()
方法允许检查是否定义了Model实例的公钥。
BaseDatabaseOperations.adapt_decimalfield_value()
现在是无操作的,只需返回给定的值。
django.contrib.gis
¶已删除对PostGIS 3.0的支持。
已删除对GDAL 3.0的支持。
对PostgreSQL 13的上游支持将于2025年11月结束。Django 5.2支持PostgreSQL 14及更高版本。
MySQL连接现在默认使用 utf8mb4
字符集,而不是 utf8
,这是不推荐的字符集的别名 utf8mb3
. utf8mb3
可以在 OPTIONS
的一部分 DATABASES
如果遗留数据库需要,则设置。
添加 EmailMultiAlternatives.alternatives
现在仅通过 attach_alternative()
法
的最低支持版本 gettext
从0.15增加到0.19。
HttpRequest.accepted_types
现在根据客户的偏好、基于请求的 Accept
标头
的属性 UniqueConstraint.violation_error_code
和 UniqueConstraint.violation_error_message
现在总是在提供时使用。此前,如果他们 UniqueConstraint.fields
设置没有 UniqueConstraint.condition
.
的 debug()
上下文处理器不再包含在默认项目模板中。
以下方法现在具有 alters_data=True
设置为防止副作用时 rendering a template context :
的最低支持版本 oracledb
从1.3.2增加到2.3.0。
仅接受一个参数的内置聚合函数 (Avg
, Count
, Max
, Min
, StdDev
, Sum
,而且 Variance
)现在提高 TypeError
当用不正确的参数数量调用时。
这个 all
的论据 django.contrib.staticfiles.finders.find()
该函数已被弃用,转而采用 find_all
争论。
倒退到 request.user
当 user
是 None
在 django.contrib.auth.login()
和 django.contrib.auth.alogin()
将被移除。
的 ordering
PostgreSQL特定聚合函数的关键字参数 django.contrib.postgres.aggregates.ArrayAgg
, django.contrib.postgres.aggregates.JSONBAgg
,而且 django.contrib.postgres.aggregates.StringAgg
被反对支持 order_by
论点
支持子类 RemoteUserMiddleware
该推翻 process_request()
不推翻 aprocess_request()
已经过时了
5月 28, 2025