Django 5.1发布说明

August 7, 2024

欢迎来到Django 5.1!

这些发行说明涵盖 new features ,以及一些 backwards incompatible changes 从Django 5.0或更早版本升级时您应该注意这一点。我们 begun the deprecation process for some features 。

见 如何将Django升级到更新版本 如果正在更新现有项目,则提供指南。

python兼容性

Django 5.1支持Python 3.10、3.11、3.12和3.13(自5.1.3起)。我们 highly recommend 并且仅正式支持每个系列的最新版本。

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 }}&amp;
    {% 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还介绍了 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

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

django.contrib.postgres

  • BTreeIndex 现在支持 deduplicate_items 参数。

django.contrib.sessions

数据库后端

错误报告

  • 为了提高可访问性,技术性的404和500错误页面现在对页眉、页脚和主要内容区域使用了HTML标志性元素。

文件存储

形式

  • 为了提高可访问性并使屏幕阅读器能够将字段集与其帮助文本相关联,表单字段集现在包括 aria-describedby Html属性。

管理命令

迁徙

模型

模板

  • 自定义标记现在可以在 Parser 对象,该对象稍后将在 Template 举个例子。这样的数据可以由例如模板加载器或其他模板客户端使用。

  • Template engines 现在实现一个 check() 方法,该方法已在检查框架中注册。

测验

验证器

5.1中向后不兼容的更改

django.contrib.gis

  • 删除了对PostGIS 2.5的支持。

  • 删除对小于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"> 元素。

  • 为了提高可访问性,用于 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 当通过此管理操作删除多个对象时,不会发送。

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() 已弃用。

  • 这个 check 的关键字参数 CheckConstraint 不推荐使用,而支持 condition 。

  • 未登记的人 OS_OPEN_FLAGS 的属性 FileSystemStorage 已被废弃。要允许存储中的收件箱文件,请设置新的 allow_overwrite 选项以 True 取而代之的是。

  • 这个 get_cache_name() 方法论 FieldCacheMixin 不推荐使用,而支持 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 将删除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() 函数被删除。