Django 5.1 版本发行说明¶
2024 年 8 月 7 日
欢迎使用 Django 5.1!
这些发布说明涵盖了 新功能,以及从 Django 5.0 或更早版本升级时应注意的一些 不兼容的更改。我们已经 开始对一些功能进行弃用处理。
如果你要更新现有的项目,请看 如何将 Django 更新至新的版本 指南。
Python 兼容性¶
Django 5.1 支持 Python 3.10、3.11、3.12 和 3.13(截至 5.1.3)。我们 强烈建议 并且仅官方支持每个系列的最新版本。
Django 5.1 新特性¶
{% querystring %} 模版标签¶
Django 5.1 引入了 {% querystring %} 模板标签,简化了 URL 中查询参数的修改,使得生成在添加或更改特定参数的同时保持现有查询参数的链接变得更加容易。
例如,在模板中处理分页和查询字符串可能会很繁琐。考虑以下模板片段,它动态生成了一个用于在分页视图中导航到下一页的 URL:
{# Linebreaks added for readability, this should be one, long line. #}
<a href="?{% for key, values in request.GET.iterlists %}
{% if key != "page" %}
{% for value in values %}
{{ key }}={{ value }}&
{% endfor %}
{% endif %}
{% endfor %}page={{ page.next_page_number }}">Next page</a>
当切换到使用这个新的模板标签时,上面的代码神奇地变成了:
<a href="{% querystring page=page.next_page_number %}">Next page</a>
PostgreSQL 连接池¶
Django 5.1 还引入了对 PostgreSQL 的 连接池 支持。由于建立新连接的时间可能相对较长,保持连接打开可以减少延迟。
要使用 psycopg 的连接池,你可以在 OPTIONS 中将 "pool" 选项设置为一个字典,传递给 ConnectionPool,或者设置为 True 以使用 ConnectionPool 的默认值:
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql",
# ...
"OPTIONS": {
"pool": {
"min_size": 2,
"max_size": 4,
"timeout": 10,
}
},
},
}
默认情况下需要身份验证的中间件¶
新的 LoginRequiredMiddleware 将所有未经身份验证的请求重定向到登录页面。视图可以使用新的 login_not_required() 装饰器来允许未经身份验证的请求。
LoginRequiredMiddleware 尊重通过 login_required() 装饰器设置的 login_url 和 redirect_field_name 值,但不支持通过 LoginRequiredMixin 设置 login_url 或 redirect_field_name。
要启用此功能,请将 "django.contrib.auth.middleware.LoginRequiredMiddleware" 添加到你的 MIDDLEWARE 设置中。
次要特性¶
django.contrib.admin¶
ModelAdmin.list_display现在支持使用__查找来列出相关模型的字段。
django.contrib.auth¶
PBKDF2 密码哈希器的默认迭代次数从 720,000 增加到 870,000。
ScryptPasswordHasher的默认parallelism从 1 增加到 5,以遵循 OWASP 的建议。新的
AdminUserCreationForm和现有的AdminPasswordChangeForm现在支持通过在表单保存时设置不可用密码来禁用基于密码的身份验证。现在在访问用户创建和密码更改页面时,管理界面中也提供了此功能。login_required()、permission_required()和user_passes_test()装饰器现在支持包装异步视图函数。ReadOnlyPasswordHashWidget现在包含一个重置用户密码的按钮,取代了之前嵌入在ReadOnlyPasswordHashField帮助文本中的链接,从而提高了UserChangeForm的整体可访问性。
django.contrib.gis¶
BoundingCircle现在在 SpatiaLite 5.1+ 上受支持。Collect现在在 MySQL 8.0.24+ 上受支持。GeoIP2现在允许使用ipaddress.IPv4Address或ipaddress.IPv6Address对象进行查询。GeoIP2.country()现在暴露了continent_code、continent_name和is_in_european_union值。GeoIP2.city()现在暴露了accuracy_radius和region_name值。此外,dma_code和region值现在分别暴露为metro_code和region_code,但为了向后兼容,之前的键仍然保留。Area现在支持ha单位。新的
OGRGeometry.is_3d属性允许检查几何体是否具有Z坐标维度。新的
OGRGeometry.set_3d()方法允许添加和移除Z坐标维度。OGRGeometry、Point、LineString、Polygon和GeometryCollection及其子类现在通过新的OGRGeometry.is_measured和m属性以及OGRGeometry.set_measured()方法支持测量几何体。OGRGeometry.centroid现在在所有支持的几何体类型上都可用。
django.contrib.postgres¶
BTreeIndex现在支持deduplicate_items参数。
django.contrib.sessions¶
django.contrib.sessions.backends.cached_db.SessionStore现在处理在缓存中存储会话信息时的异常,通过新添加的 sessions logger 记录适当的错误信息及其回溯。django.contrib.sessions.backends.base.SessionBase和所有内置的会话引擎现在提供了异步 API。新的异步方法都以a前缀命名,例如aget()、akeys()或acycle_key()。
数据库后端¶
"init_command"选项现在在 SQLite 的OPTIONS中受支持,允许指定在连接时设置的 pragma options。"pool"选项现在在 PostgreSQL 的OPTIONS中受支持,允许使用 connection pools。
错误报告¶
为了提高可访问性,技术性的 404 和 500 错误页面现在对页眉、页脚和主要内容区域使用 HTML 地标元素。
文件存储¶
FileSystemStorage的allow_overwrite参数现在允许将新文件保存到现有文件上。
表单¶
为了提高可访问性并使屏幕阅读器能够将字段集与其帮助文本关联起来,表单字段集现在包含
aria-describedbyHTML 属性。
管理命令¶
makemigrations命令现在为每个操作显示有意义的符号,以突出显示操作类别。
迁移¶
新的
Operation.category属性允许指定makemigrations使用的操作类别,以便为操作显示有意义的符号。
模型¶
QuerySet.explain()现在在 PostgreSQL 16+ 上支持generic_plan选项。RowRange现在接受start参数的正整数和end参数的负整数。RowRange和ValueRange的新exclusion参数允许从窗口框架中排除行、组和并列项。QuerySet.order_by()现在支持通过注解转换(如JSONObject键和ArrayAgg索引)进行排序。输出
CharField、EmailField、SlugField、URLField、TextField或ArrayField的F()和OuterRef()表达式现在可以 切片。Model.refresh_from_db()和Model.arefresh_from_db()的新from_queryset参数允许自定义用于重新加载模型值的查询集。这可以用于在重新加载之前锁定行或选择相关对象。新的
Expression.constraint_validation_compatible属性允许指定在约束验证期间忽略该表达式。
模板¶
自定义标签现在可以在
Parser对象上设置额外的数据,这些数据稍后将在Template实例上可用。例如,模板加载器或其他模板客户端可以使用这些数据。模板引擎 现在实现了一个
check()方法,该方法已经注册到检查框架中。
测试¶
assertContains()、assertNotContains()和assertInHTML()断言现在将干草堆添加到断言错误消息中。RequestFactory、AsyncRequestFactory、Client和AsyncClient类现在支持query_params参数,该参数接受查询字符串键和值的字典。这使得在任何 HTTP 方法上设置查询字符串变得更加容易。self.client.post("/items/1", query_params={"action": "delete"}) await self.async_client.post("/items/1", query_params={"action": "delete"})
新的
SimpleTestCase.assertNotInHTML()断言允许测试给定的 HTML 干草堆中不包含某个 HTML 片段。为了强制测试隔离,
SimpleTestCase中不再允许在线程内使用数据库连接。
验证器¶
新的
DomainNameValidator验证域名,包括国际化域名。新的validate_domain_name()函数返回DomainNameValidator的实例。
5.1 版本中不向后兼容的变更¶
django.contrib.gis¶
移除对 PostGIS 2.5 的支持。
已移除对
PROJ版本低于 6 的支持。移除对 GDAL 2.4 的支持。
GeoIP2在提供目录路径时不再同时打开城市和国家数据库,而是优先使用城市数据库(如果可用)。国家数据库是城市数据库的子集,通常不需要同时使用两者。如果你需要在与城市数据库相同的目录中使用国家数据库,请显式地将国家数据库路径传递给构造函数。
不再支持 MariaDB 10.4¶
上游对 MariaDB 10.4 的支持将于 2024 年 6 月结束。Django 5.1 支持 MariaDB 10.5 及更高版本。
不再支持 PostgreSQL 12¶
上游对 PostgreSQL 12 的支持将于 2024 年 11 月结束。Django 5.1 支持 PostgreSQL 13 及更高版本。
杂项¶
为了提高可访问性,管理界面的变更列表过滤器现在在
<nav>标签中渲染,而不是<div>。为了提高可访问性,管理界面的页脚现在在
<footer>标签中渲染,而不是<div>,并且移动到<div id="main">元素下方。为了提高可访问性,当字段集有名称并使用
collapse类时,用于ModelAdmin.fieldsets和InlineModelAdmin.fieldsets的可展开小部件现在包含<details>和<summary>元素。JavaScript 文件
collapse.js已被移除,因为它在 Django 管理站点中不再需要。SimpleTestCase.assertURLEqual()和assertInHTML()现在在msg_prefix中添加": "。这与其他断言的行为一致。truncatechars_html和truncatewords_html模板过滤器使用的django.utils.text.Truncator现在使用html.parser.HTMLParser子类。这使得操作更加健壮和快速,但输出可能会有细微差异。未记录的
django.urls.converters.get_converter()函数已被移除。SQLite 的最低支持版本从 3.27.0 提高到 3.31.0。
FileField现在在保存没有name的文件时会引发FieldError。ImageField.update_dimension_fields(force=True)在将图像保存到存储后不再调用。如果你的存储后端调整了图像大小,width_field和height_field将与图像的宽度和高度不匹配。asgiref的最低支持版本从 3.7.0 提高到 3.8.1。To improve performance, the
delete_selectedadmin action now usesQuerySet.bulk_create()when creating multipleLogEntryobjects. As a result,pre_saveandpost_savesignals forLogEntryare not sent when multiple objects are deleted via this admin action.
在 5.1 版本中废弃的功能¶
杂项¶
ModelAdmin.log_deletion()和LogEntryManager.log_action()方法已被弃用。子类应实现ModelAdmin.log_deletions()和LogEntryManager.log_actions()。未记录的
django.utils.itercompat.is_iterable()函数和django.utils.itercompat模块已被弃用。请使用isinstance(..., collections.abc.Iterable)代替。django.contrib.gis.geoip2.GeoIP2.coords()方法已被弃用。请使用django.contrib.gis.geoip2.GeoIP2.lon_lat()代替。django.contrib.gis.geoip2.GeoIP2.open()方法已被弃用。请使用GeoIP2构造函数代替。在
Model.save()和Model.asave()中传递位置参数已被弃用,建议仅使用关键字参数。设置
django.contrib.gis.gdal.OGRGeometry.coord_dim已被弃用。请使用set_3d()代替。不推荐使用
django.urls.register_converter()覆盖现有的转换器。CheckConstraint的check关键字参数已被弃用,建议使用condition。未记录的
FileSystemStorage的OS_OPEN_FLAGS属性已被弃用。要允许覆盖存储中的文件,请将新的allow_overwrite选项设置为True。FieldCacheMixin的get_cache_name()方法已被弃用,建议使用cache_name缓存属性。
在 5.1 版本中移除的功能¶
这些功能已达到其弃用周期的末尾,并在 Django 5.1 中被移除。
有关这些更改的详细信息,包括如何移除这些功能的使用,请参阅 在 4.2 版本中弃用的功能。
BaseUserManager.make_random_password()方法已被移除。模型的
Meta.index_together选项已被移除。length_is模板过滤器已被移除。django.contrib.auth.hashers.SHA1PasswordHasher、django.contrib.auth.hashers.UnsaltedSHA1PasswordHasher和django.contrib.auth.hashers.UnsaltedMD5PasswordHasher已被移除。django.contrib.postgres.fields.CICharField、django.contrib.postgres.fields.CIEmailField和django.contrib.postgres.fields.CITextField模型已被移除,仅支持历史迁移。django.contrib.postgres.fields.CIText混入类已被移除。BaseGeometryWidget的map_width和map_height属性已被移除。SimpleTestCase.assertFormsetError()方法已被移除。TransactionTestCase.assertQuerysetEqual()方法已被移除。支持将编码的 JSON 字符串字面量传递给
JSONField及相关查找和表达式的功能已被移除。支持将位置参数传递给
Signer和TimestampSigner的功能已被移除。DEFAULT_FILE_STORAGE和STATICFILES_STORAGE设置已被移除。django.core.files.storage.get_storage_class()函数已被移除。