August 7, 2024
欢迎来到Django 5.1!
这些发行说明涵盖 new features ,以及一些 backwards incompatible changes 从Django 5.0或更早版本升级时您应该注意这一点。我们 begun the deprecation process for some features 。
见 如何将Django升级到更新版本 如果正在更新现有项目,则提供指南。
Django 5.1支持Python 3.10、3.11、3.12和3.13(自5.1.3起)。我们 highly recommend 并且仅正式支持每个系列的最新版本。
{% 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>
Django 5.1还介绍了 connection pool 支持PostgreSQL。由于建立新连接的时间可能相对较长,因此保持连接打开可以减少延迟。
要将连接池与 psycopg ,您可以设置 "pool" 内部选项 OPTIONS 成为要传授的判决书 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_url 和 redirect_field_name 通过 login_required() 装饰器,但不支持设置 login_url 或 redirect_field_name 经由 LoginRequiredMixin .
要启用此功能,请添加 "django.contrib.auth.middleware.LoginRequiredMiddleware" 到您 MIDDLEWARE 设置.
django.contrib.admin¶ModelAdmin.list_display 现在支持使用 __ 查找以列出相关模型中的字段。
django.contrib.auth¶PBKDF2密码散列器的默认迭代计数从720,000增加到870,000。
默认设置 parallelism 的 ScryptPasswordHasher 遵循OWSP建议,从1增加到5。
新 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" 选项现在在中受支持 OPTIONS 在SQLite上允许指定 pragma options 在连接时设置。
"pool" 选项现在在中受支持 OPTIONS 在PostgreSQL上允许使用 connection pools 。
为了提高可访问性,技术性的404和500错误页面现在对页眉、页脚和主要内容区域使用了HTML标志性元素。
这个 allow_overwrite 的参数 FileSystemStorage 现在允许在现有文件上保存新文件。
为了提高可访问性并使屏幕阅读器能够将字段集与其帮助文本相关联,表单字段集现在包括 aria-describedby Html属性。
这个 makemigrations 命令现在为每个要突出显示的操作显示有意义的符号 operation categories 。
新的 Operation.category 属性允许指定一个 operation category 由 makemigrations 以显示操作的有意义的符号。
QuerySet.explain() 现在支持 generic_plan PostgreSQL 16+上的选项。
RowRange 现在接受正整数作为 start 参数和负整数 end 争论。
新的 exclusion 的论点 RowRange 和 ValueRange 允许从窗口框架中排除行、组和系带。
QuerySet.order_by() 现在支持按批注转换排序,例如 JSONObject 钥匙和 ArrayAgg 指数。
F() 和 OuterRef() 输出以下内容的表达式 CharField , EmailField , SlugField , URLField , TextField ,或 ArrayField 现在可以是 sliced 。
新的 from_queryset 的论点 Model.refresh_from_db() 和 Model.arefresh_from_db() 允许定制用于重新加载模型值的查询集。这可用于在重新加载之前锁定行或选择相关对象。
新的 Expression.constraint_validation_compatible 属性允许指定在约束验证期间应忽略该表达。
自定义标记现在可以在 Parser 对象,该对象稍后将在 Template 举个例子。这样的数据可以由例如模板加载器或其他模板客户端使用。
Template engines 现在实现一个 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 。
django.contrib.gis¶删除了对PostGIS 2.5的支持。
删除对小于6的项目的支持。
删除了对GDAL 2.4的支持。
GeoIP2 在提供目录路径时,不再同时打开城市和国家/地区数据库,如果城市数据库可用,则首选城市数据库。国家数据库是城市数据库的子集,通常不需要这两个数据库。如果需要在与城市数据库位于同一目录中时使用国家/地区数据库,请将国家/地区数据库路径显式传递给构造函数。
对MariaDB 10.4的上游支持将于2024年6月结束。Django 5.1支持MariaDB 10.5及更高版本。
对PostgreSQL 12的上游支持将于2024年11月结束。Django 5.1支持PostgreSQL 13及更高版本。
为了提高可访问性,管理员的更改列表筛选器现在呈现在 <nav> 标记而不是 <div> 。
为了提高可访问性,管理员的页脚现在呈现在 <footer> 标记而不是 <div> ,并且还移动到 <div id="main"> 元素。
为了提高可访问性,用于 ModelAdmin.fieldsets 和 InlineModelAdmin.fieldsets ,当字段集有名称并使用 collapse 类,现在包括 <details> 和 <summary> 元素。
JavaScript文件 collapse.js 已被删除,因为Django管理站点中不再需要它。
SimpleTestCase.assertURLEqual() 和 assertInHTML() 现在添加 ": " 发送到 msg_prefix 。这与其他断言的行为是一致的。
django.utils.text.Truncator 使用者 truncatechars_html 和 truncatewords_html 模板筛选器现在使用 html.parser.HTMLParser 子类。这会导致更稳健和更快的操作,但输出可能会有很小的差异。
未登记的人 django.urls.converters.get_converter() 函数被删除。
SQLite支持的最低版本从3.27.0增加到3.31.0。
FileField 现在引发一个 FieldError 保存没有 name 。
ImageField.update_dimension_fields(force=True) 将图像保存到存储后不再调用。如果您的存储后台调整了图像的大小, width_field 和 height_field 将不匹配图像的宽度和高度。
的最低支持版本 asgiref 从3.7.0增加到3.8.1。
为了提高性能, delete_selected 管理操作现在使用 QuerySet.bulk_create() 创建多个时 LogEntry 对象结果, pre_save 和 post_save 信号 LogEntry 当通过此管理操作删除多个对象时,不会发送。
这个 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() 已弃用。
这个 check 的关键字参数 CheckConstraint 不推荐使用,而支持 condition 。
未登记的人 OS_OPEN_FLAGS 的属性 FileSystemStorage 已被废弃。要允许存储中的收件箱文件,请设置新的 allow_overwrite 选项以 True 取而代之的是。
这个 get_cache_name() 方法论 FieldCacheMixin 不推荐使用,而支持 cache_name 缓存的财产。
这些功能已经到了弃用周期的末尾,并在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 将删除Mixin。
这个 map_width 和 map_height 的属性 BaseGeometryWidget 都被移除了。
这个 SimpleTestCase.assertFormsetError() 方法被移除。
这个 TransactionTestCase.assertQuerysetEqual() 方法被移除。
支持将编码的JSON字符串文字传递给 JSONField 并且相关联的查找和表达式被移除。
支持将位置参数传递给 Signer 和 TimestampSigner 被移除。
这个 DEFAULT_FILE_STORAGE 和 STATICFILES_STORAGE 设置已删除。
这个 django.core.files.storage.get_storage_class() 函数被删除。
5月 28, 2025