5.1.txt 17 KB

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