5.1.txt 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488
  1. ========================
  2. Django 5.1 release notes
  3. ========================
  4. *August 7, 2024*
  5. Welcome to Django 5.1!
  6. These release notes cover the :ref:`new features <whats-new-5.1>`, as well as
  7. some :ref:`backwards incompatible changes <backwards-incompatible-5.1>` you
  8. should be aware of when upgrading from Django 5.0 or earlier. We've
  9. :ref:`begun the deprecation process for some features
  10. <deprecated-features-5.1>`.
  11. See the :doc:`/howto/upgrade-version` guide if you're updating an existing
  12. project.
  13. Python compatibility
  14. ====================
  15. Django 5.1 supports Python 3.10, 3.11, and 3.12. We **highly recommend** and
  16. only officially support the latest release of each series.
  17. .. _whats-new-5.1:
  18. What's new in Django 5.1
  19. ========================
  20. ``{% querystring %}`` template tag
  21. -----------------------------------
  22. Django 5.1 introduces the :ttag:`{% querystring %} <querystring>` template
  23. tag, simplifying the modification of query parameters in URLs, making it easier
  24. to generate links that maintain existing query parameters while adding or
  25. changing specific ones.
  26. For instance, navigating pagination and query strings in templates can be
  27. cumbersome. Consider this template fragment that dynamically generates a URL
  28. for navigating to the next page within a paginated view:
  29. .. code-block:: html+django
  30. {# Linebreaks added for readability, this should be one, long line. #}
  31. <a href="?{% for key, values in request.GET.iterlists %}
  32. {% if key != "page" %}
  33. {% for value in values %}
  34. {{ key }}={{ value }}&amp;
  35. {% endfor %}
  36. {% endif %}
  37. {% endfor %}page={{ page.next_page_number }}">Next page</a>
  38. When switching to using this new template tag, the above magically becomes:
  39. .. code-block:: html+django
  40. <a href="{% querystring page=page.next_page_number %}">Next page</a>
  41. PostgreSQL Connection Pools
  42. ---------------------------
  43. Django 5.1 also introduces :ref:`connection pool <postgresql-pool>` support for
  44. PostgreSQL. As the time to establish a new connection can be relatively long,
  45. keeping connections open can reduce latency.
  46. To use a connection pool with `psycopg`_, you can set the ``"pool"`` option
  47. inside :setting:`OPTIONS` to be a dict to be passed to
  48. :class:`~psycopg:psycopg_pool.ConnectionPool`, or to ``True`` to use the
  49. ``ConnectionPool`` defaults::
  50. DATABASES = {
  51. "default": {
  52. "ENGINE": "django.db.backends.postgresql",
  53. # ...
  54. "OPTIONS": {
  55. "pool": {
  56. "min_size": 2,
  57. "max_size": 4,
  58. "timeout": 10,
  59. }
  60. },
  61. },
  62. }
  63. .. _psycopg: https://www.psycopg.org/
  64. Middleware to require authentication by default
  65. -----------------------------------------------
  66. The new :class:`~django.contrib.auth.middleware.LoginRequiredMiddleware`
  67. redirects all unauthenticated requests to a login page. Views can allow
  68. unauthenticated requests by using the new
  69. :func:`~django.contrib.auth.decorators.login_not_required` decorator.
  70. ``LoginRequiredMiddleware`` respects the ``login_url`` and
  71. ``redirect_field_name`` values set via the
  72. :func:`~.django.contrib.auth.decorators.login_required` decorator, but does not
  73. support setting ``login_url`` or ``redirect_field_name`` via the
  74. :class:`~django.contrib.auth.mixins.LoginRequiredMixin`.
  75. To enable this, add ``"django.contrib.auth.middleware.LoginRequiredMiddleware"``
  76. to your :setting:`MIDDLEWARE` setting.
  77. Minor features
  78. --------------
  79. :mod:`django.contrib.admin`
  80. ~~~~~~~~~~~~~~~~~~~~~~~~~~~
  81. * :attr:`.ModelAdmin.list_display` now supports using ``__`` lookups to list
  82. fields from related models.
  83. :mod:`django.contrib.auth`
  84. ~~~~~~~~~~~~~~~~~~~~~~~~~~
  85. * The default iteration count for the PBKDF2 password hasher is increased from
  86. 720,000 to 870,000.
  87. * The default ``parallelism`` of the ``ScryptPasswordHasher`` is
  88. increased from 1 to 5, to follow OWASP recommendations.
  89. * The new :class:`~django.contrib.auth.forms.AdminUserCreationForm` and
  90. the existing :class:`~django.contrib.auth.forms.AdminPasswordChangeForm` now
  91. support disabling password-based authentication by setting an unusable
  92. password on form save. This is now available in the admin when visiting the
  93. user creation and password change pages.
  94. * :func:`~.django.contrib.auth.decorators.login_required`,
  95. :func:`~.django.contrib.auth.decorators.permission_required`, and
  96. :func:`~.django.contrib.auth.decorators.user_passes_test` decorators now
  97. support wrapping asynchronous view functions.
  98. * ``ReadOnlyPasswordHashWidget`` now includes a button to reset the user's
  99. password, which replaces the link previously embedded in the
  100. ``ReadOnlyPasswordHashField``'s help text, improving the overall
  101. accessibility of the
  102. :class:`~django.contrib.auth.forms.UserChangeForm`.
  103. :mod:`django.contrib.gis`
  104. ~~~~~~~~~~~~~~~~~~~~~~~~~
  105. * :class:`~django.contrib.gis.db.models.functions.BoundingCircle` is now
  106. supported on SpatiaLite 5.1+.
  107. * :class:`~django.contrib.gis.db.models.Collect` is now supported on MySQL
  108. 8.0.24+.
  109. * :class:`~django.contrib.gis.geoip2.GeoIP2` now allows querying using
  110. :class:`ipaddress.IPv4Address` or :class:`ipaddress.IPv6Address` objects.
  111. * :meth:`.GeoIP2.country` now exposes the ``continent_code``,
  112. ``continent_name``, and ``is_in_european_union`` values.
  113. * :meth:`.GeoIP2.city` now exposes the ``accuracy_radius`` and ``region_name``
  114. values. In addition, the ``dma_code`` and ``region`` values are now exposed
  115. as ``metro_code`` and ``region_code``, but the previous keys are also
  116. retained for backward compatibility.
  117. * :class:`~django.contrib.gis.measure.Area` now supports the ``ha`` unit.
  118. * The new :attr:`.OGRGeometry.is_3d` attribute allows checking if a geometry
  119. has a ``Z`` coordinate dimension.
  120. * The new :meth:`.OGRGeometry.set_3d` method allows addition and removal of the
  121. ``Z`` coordinate dimension.
  122. * :class:`~django.contrib.gis.gdal.OGRGeometry`,
  123. :class:`~django.contrib.gis.gdal.Point`,
  124. :class:`~django.contrib.gis.gdal.LineString`,
  125. :class:`~django.contrib.gis.gdal.Polygon`, and
  126. :class:`~django.contrib.gis.gdal.GeometryCollection` and its subclasses now
  127. support measured geometries via the new :attr:`.OGRGeometry.is_measured` and
  128. ``m`` properties, and the :meth:`.OGRGeometry.set_measured` method.
  129. * :attr:`.OGRGeometry.centroid` is now available on all supported geometry
  130. types.
  131. * :class:`FromWKB() <django.contrib.gis.db.models.functions.FromWKB>` and
  132. :class:`FromWKT() <django.contrib.gis.db.models.functions.FromWKT>` functions
  133. now support the optional ``srid`` argument (except for Oracle where it is
  134. ignored).
  135. :mod:`django.contrib.postgres`
  136. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  137. * :class:`~django.contrib.postgres.indexes.BTreeIndex` now supports the
  138. ``deduplicate_items`` parameter.
  139. :mod:`django.contrib.sessions`
  140. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  141. * :class:`django.contrib.sessions.backends.cached_db.SessionStore` now handles
  142. exceptions when storing session information in the cache, logging proper
  143. error messages with their traceback via the newly added
  144. :ref:`sessions logger <django-contrib-sessions-logger>`.
  145. * :class:`django.contrib.sessions.backends.base.SessionBase` and all built-in
  146. session engines now provide async API. The new asynchronous methods all have
  147. ``a`` prefixed names, e.g. ``aget()``, ``akeys()``, or ``acycle_key()``.
  148. Database backends
  149. ~~~~~~~~~~~~~~~~~
  150. * ``"init_command"`` option is now supported in :setting:`OPTIONS` on SQLite
  151. to allow specifying :ref:`pragma options <sqlite-init-command>` to set upon
  152. connection.
  153. * ``"transaction_mode"`` option is now supported in :setting:`OPTIONS` on
  154. SQLite to allow specifying the :ref:`sqlite-transaction-behavior`.
  155. * ``"pool"`` option is now supported in :setting:`OPTIONS` on PostgreSQL to
  156. allow using :ref:`connection pools <postgresql-pool>`.
  157. Error Reporting
  158. ~~~~~~~~~~~~~~~
  159. * In order to improve accessibility, the technical 404 and 500 error pages now
  160. use HTML landmark elements for the header, footer, and main content areas.
  161. File Storage
  162. ~~~~~~~~~~~~
  163. * The :attr:`~django.core.files.storage.FileSystemStorage.allow_overwrite`
  164. parameter of :class:`~django.core.files.storage.FileSystemStorage` now allows
  165. saving new files over existing ones.
  166. Forms
  167. ~~~~~
  168. * In order to improve accessibility and enable screen readers to associate
  169. fieldsets with their help text, the form fieldset now includes the
  170. ``aria-describedby`` HTML attribute.
  171. Management Commands
  172. ~~~~~~~~~~~~~~~~~~~
  173. * The :djadmin:`makemigrations` command now displays meaningful symbols for
  174. each operation to highlight :class:`operation categories
  175. <django.db.migrations.operations.base.OperationCategory>`.
  176. Migrations
  177. ~~~~~~~~~~
  178. * The new ``Operation.category`` attribute allows specifying an
  179. :class:`operation category
  180. <django.db.migrations.operations.base.OperationCategory>` used by the
  181. :djadmin:`makemigrations` to display a meaningful symbol for the operation.
  182. Models
  183. ~~~~~~
  184. * :meth:`.QuerySet.explain` now supports the ``generic_plan`` option on
  185. PostgreSQL 16+.
  186. * :class:`~django.db.models.expressions.RowRange` now accepts positive integers
  187. for the ``start`` argument and negative integers for the ``end`` argument.
  188. * The new ``exclusion`` argument of
  189. :class:`~django.db.models.expressions.RowRange` and
  190. :class:`~django.db.models.expressions.ValueRange` allows excluding rows,
  191. groups, and ties from the window frames.
  192. * :meth:`.QuerySet.order_by` now supports ordering by annotation transforms
  193. such as ``JSONObject`` keys and ``ArrayAgg`` indices.
  194. * :class:`F() <django.db.models.F>` and :class:`OuterRef()
  195. <django.db.models.OuterRef>` expressions that output
  196. :class:`~django.db.models.CharField`, :class:`~django.db.models.EmailField`,
  197. :class:`~django.db.models.SlugField`, :class:`~django.db.models.URLField`,
  198. :class:`~django.db.models.TextField`, or
  199. :class:`~django.contrib.postgres.fields.ArrayField` can now be :ref:`sliced
  200. <slicing-using-f>`.
  201. * The new ``from_queryset`` argument of :meth:`.Model.refresh_from_db` and
  202. :meth:`.Model.arefresh_from_db` allows customizing the queryset used to
  203. reload a model's value. This can be used to lock the row before reloading or
  204. to select related objects.
  205. * The new :attr:`.Expression.constraint_validation_compatible` attribute allows
  206. specifying that the expression should be ignored during a constraint
  207. validation.
  208. Templates
  209. ~~~~~~~~~
  210. * Custom tags may now set extra data on the ``Parser`` object that will later
  211. be made available on the ``Template`` instance. Such data may be used, for
  212. example, by the template loader, or other template clients.
  213. * :ref:`Template engines <field-checking>` now implement a ``check()`` method
  214. that is already registered with the check framework.
  215. Tests
  216. ~~~~~
  217. * :meth:`~django.test.SimpleTestCase.assertContains`,
  218. :meth:`~django.test.SimpleTestCase.assertNotContains`, and
  219. :meth:`~django.test.SimpleTestCase.assertInHTML` assertions now add haystacks
  220. to assertion error messages.
  221. * The :class:`~django.test.RequestFactory`,
  222. :class:`~django.test.AsyncRequestFactory`, :class:`~django.test.Client`, and
  223. :class:`~django.test.AsyncClient` classes now support the ``query_params``
  224. parameter, which accepts a dictionary of query string keys and values. This
  225. allows setting query strings on any HTTP methods more easily.
  226. .. code-block:: python
  227. self.client.post("/items/1", query_params={"action": "delete"})
  228. await self.async_client.post("/items/1", query_params={"action": "delete"})
  229. * The new :meth:`.SimpleTestCase.assertNotInHTML` assertion allows testing that
  230. an HTML fragment is not contained in the given HTML haystack.
  231. * In order to enforce test isolation, database connections inside threads are
  232. no longer allowed in :class:`~django.test.SimpleTestCase`.
  233. Validators
  234. ~~~~~~~~~~
  235. * The new :class:`~django.core.validators.DomainNameValidator` validates domain
  236. names, including internationalized domain names. The new
  237. :func:`~django.core.validators.validate_domain_name` function returns an
  238. instance of :class:`~django.core.validators.DomainNameValidator`.
  239. .. _backwards-incompatible-5.1:
  240. Backwards incompatible changes in 5.1
  241. =====================================
  242. :mod:`django.contrib.gis`
  243. -------------------------
  244. * Support for PostGIS 2.5 is removed.
  245. * Support for PROJ < 6 is removed.
  246. * Support for GDAL 2.4 is removed.
  247. * :class:`~django.contrib.gis.geoip2.GeoIP2` no longer opens both city and
  248. country databases when a directory path is provided, preferring the city
  249. database, if it is available. The country database is a subset of the city
  250. database and both are not typically needed. If you require use of the country
  251. database when in the same directory as the city database, explicitly pass the
  252. country database path to the constructor.
  253. Dropped support for MariaDB 10.4
  254. --------------------------------
  255. Upstream support for MariaDB 10.4 ends in June 2024. Django 5.1 supports
  256. MariaDB 10.5 and higher.
  257. Dropped support for PostgreSQL 12
  258. ---------------------------------
  259. Upstream support for PostgreSQL 12 ends in November 2024. Django 5.1 supports
  260. PostgreSQL 13 and higher.
  261. Miscellaneous
  262. -------------
  263. * In order to improve accessibility, the admin's changelist filter is now
  264. rendered in a ``<nav>`` tag instead of a ``<div>``.
  265. * In order to improve accessibility, the admin's footer is now rendered in
  266. a ``<footer>`` tag instead of a ``<div>``, and also moved below the
  267. ``<div id="main">`` element.
  268. * In order to improve accessibility, the expandable widget used for
  269. :attr:`ModelAdmin.fieldsets <django.contrib.admin.ModelAdmin.fieldsets>` and
  270. :attr:`InlineModelAdmin.fieldsets <django.contrib.admin.InlineModelAdmin>`,
  271. when the fieldset has a name and use the ``collapse`` class, now includes
  272. ``<details>`` and ``<summary>`` elements.
  273. * The JavaScript file ``collapse.js`` is removed since it is no longer needed
  274. in the Django admin site.
  275. * :meth:`.SimpleTestCase.assertURLEqual` and
  276. :meth:`~django.test.SimpleTestCase.assertInHTML` now add ``": "`` to the
  277. ``msg_prefix``. This is consistent with the behavior of other assertions.
  278. * ``django.utils.text.Truncator`` used by :tfilter:`truncatechars_html` and
  279. :tfilter:`truncatewords_html` template filters now uses
  280. :py:class:`html.parser.HTMLParser` subclasses. This results in a more robust
  281. and faster operation, but there may be small differences in the output.
  282. * The undocumented ``django.urls.converters.get_converter()`` function is
  283. removed.
  284. * The minimum supported version of SQLite is increased from 3.27.0 to 3.31.0.
  285. * :class:`~django.db.models.FileField` now raises a
  286. :class:`~django.core.exceptions.FieldError` when saving a file without a
  287. ``name``.
  288. * ``ImageField.update_dimension_fields(force=True)`` is no longer called after
  289. saving the image to storage. If your storage backend resizes images, the
  290. ``width_field`` and ``height_field`` will not match the width and height of
  291. the image.
  292. * The minimum supported version of ``asgiref`` is increased from 3.7.0 to
  293. 3.8.1.
  294. .. _deprecated-features-5.1:
  295. Features deprecated in 5.1
  296. ==========================
  297. Miscellaneous
  298. -------------
  299. * The ``ModelAdmin.log_deletion()`` and ``LogEntryManager.log_action()``
  300. methods are deprecated. Subclasses should implement
  301. ``ModelAdmin.log_deletions()`` and ``LogEntryManager.log_actions()``
  302. instead.
  303. * The undocumented ``django.utils.itercompat.is_iterable()`` function and the
  304. ``django.utils.itercompat`` module are deprecated. Use
  305. ``isinstance(..., collections.abc.Iterable)`` instead.
  306. * The ``django.contrib.gis.geoip2.GeoIP2.coords()`` method is deprecated. Use
  307. ``django.contrib.gis.geoip2.GeoIP2.lon_lat()`` instead.
  308. * The ``django.contrib.gis.geoip2.GeoIP2.open()`` method is deprecated. Use the
  309. :class:`~django.contrib.gis.geoip2.GeoIP2` constructor instead.
  310. * Passing positional arguments to :meth:`.Model.save` and :meth:`.Model.asave`
  311. is deprecated in favor of keyword-only arguments.
  312. * Setting ``django.contrib.gis.gdal.OGRGeometry.coord_dim`` is deprecated. Use
  313. :meth:`~django.contrib.gis.gdal.OGRGeometry.set_3d` instead.
  314. * Overriding existing converters with ``django.urls.register_converter()`` is
  315. deprecated.
  316. * The ``check`` keyword argument of ``CheckConstraint`` is deprecated in favor
  317. of ``condition``.
  318. * The undocumented ``OS_OPEN_FLAGS`` property of
  319. :class:`~django.core.files.storage.FileSystemStorage` is deprecated. To allow
  320. overwriting files in storage, set the new
  321. :attr:`~django.core.files.storage.FileSystemStorage.allow_overwrite` option
  322. to ``True`` instead.
  323. * The ``get_cache_name()`` method of ``FieldCacheMixin`` is deprecated in favor
  324. of the ``cache_name`` cached property.
  325. Features removed in 5.1
  326. =======================
  327. These features have reached the end of their deprecation cycle and are removed
  328. in Django 5.1.
  329. See :ref:`deprecated-features-4.2` for details on these changes, including how
  330. to remove usage of these features.
  331. * The ``BaseUserManager.make_random_password()`` method is removed.
  332. * The model's ``Meta.index_together`` option is removed.
  333. * The ``length_is`` template filter is removed.
  334. * The ``django.contrib.auth.hashers.SHA1PasswordHasher``,
  335. ``django.contrib.auth.hashers.UnsaltedSHA1PasswordHasher``, and
  336. ``django.contrib.auth.hashers.UnsaltedMD5PasswordHasher`` are removed.
  337. * The model ``django.contrib.postgres.fields.CICharField``,
  338. ``django.contrib.postgres.fields.CIEmailField``, and
  339. ``django.contrib.postgres.fields.CITextField`` are removed, except for
  340. support in historical migrations.
  341. * The ``django.contrib.postgres.fields.CIText`` mixin is removed.
  342. * The ``map_width`` and ``map_height`` attributes of ``BaseGeometryWidget`` are
  343. removed.
  344. * The ``SimpleTestCase.assertFormsetError()`` method is removed.
  345. * The ``TransactionTestCase.assertQuerysetEqual()`` method is removed.
  346. * Support for passing encoded JSON string literals to ``JSONField`` and
  347. associated lookups and expressions is removed.
  348. * Support for passing positional arguments to ``Signer`` and
  349. ``TimestampSigner`` is removed.
  350. * The ``DEFAULT_FILE_STORAGE`` and ``STATICFILES_STORAGE`` settings is removed.
  351. * The ``django.core.files.storage.get_storage_class()`` function is removed.