5.1.txt 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460
  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. * :class:`~django.contrib.auth.forms.BaseUserCreationForm` and
  34. :class:`~django.contrib.auth.forms.AdminPasswordChangeForm` now support
  35. disabling password-based authentication by setting an unusable password on
  36. form save. This is now available in the admin when visiting the user creation
  37. and password change pages.
  38. :mod:`django.contrib.contenttypes`
  39. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  40. * ...
  41. :mod:`django.contrib.gis`
  42. ~~~~~~~~~~~~~~~~~~~~~~~~~
  43. * :class:`~django.contrib.gis.db.models.functions.BoundingCircle` is now
  44. supported on SpatiaLite 5.1+.
  45. * :class:`~django.contrib.gis.db.models.Collect` is now supported on MySQL
  46. 8.0.24+.
  47. * :class:`~django.contrib.gis.geoip2.GeoIP2` now allows querying using
  48. :class:`ipaddress.IPv4Address` or :class:`ipaddress.IPv6Address` objects.
  49. * :meth:`.GeoIP2.country` now exposes the ``continent_code``,
  50. ``continent_name``, and ``is_in_european_union`` values.
  51. * :meth:`.GeoIP2.city` now exposes the ``accuracy_radius`` and ``region_name``
  52. values. In addition the ``dma_code`` and ``region`` values are now exposed as
  53. ``metro_code`` and ``region_code``, but the previous keys are also retained
  54. for backward compatibility.
  55. * :class:`~django.contrib.gis.measure.Area` now supports the ``ha`` unit.
  56. * The new :attr:`.OGRGeometry.is_3d` attribute allows checking if a geometry
  57. has a ``Z`` coordinate dimension.
  58. * The new :meth:`.OGRGeometry.set_3d` method allows addition and removal of the
  59. ``Z`` coordinate dimension.
  60. * :class:`~django.contrib.gis.gdal.OGRGeometry`,
  61. :class:`~django.contrib.gis.gdal.Point`,
  62. :class:`~django.contrib.gis.gdal.LineString`,
  63. :class:`~django.contrib.gis.gdal.Polygon`, and
  64. :class:`~django.contrib.gis.gdal.GeometryCollection` and its subclasses now
  65. support measured geometries via the new :attr:`.OGRGeometry.is_measured` and
  66. ``m`` properties, and the :meth:`.OGRGeometry.set_measured` method.
  67. * :attr:`.OGRGeometry.centroid` is now available on all supported geometry
  68. types.
  69. :mod:`django.contrib.messages`
  70. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  71. * ...
  72. :mod:`django.contrib.postgres`
  73. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  74. * :class:`~django.contrib.postgres.indexes.BTreeIndex` now supports the
  75. ``deduplicate_items`` parameter.
  76. :mod:`django.contrib.redirects`
  77. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  78. * ...
  79. :mod:`django.contrib.sessions`
  80. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  81. * ...
  82. :mod:`django.contrib.sitemaps`
  83. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  84. * ...
  85. :mod:`django.contrib.sites`
  86. ~~~~~~~~~~~~~~~~~~~~~~~~~~~
  87. * ...
  88. :mod:`django.contrib.staticfiles`
  89. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  90. * ...
  91. :mod:`django.contrib.syndication`
  92. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  93. * ...
  94. Asynchronous views
  95. ~~~~~~~~~~~~~~~~~~
  96. * ...
  97. Cache
  98. ~~~~~
  99. * ...
  100. CSRF
  101. ~~~~
  102. * ...
  103. Database backends
  104. ~~~~~~~~~~~~~~~~~
  105. * ``"init_command"`` option is now supported in :setting:`OPTIONS` on SQLite
  106. to allow specifying :ref:`pragma options <sqlite-init-command>` to set upon
  107. connection.
  108. Decorators
  109. ~~~~~~~~~~
  110. * ...
  111. Email
  112. ~~~~~
  113. * ...
  114. Error Reporting
  115. ~~~~~~~~~~~~~~~
  116. * In order to improve accessibility, the technical 404 and 500 error pages now
  117. use HTML landmark elements for the header, footer, and main content areas.
  118. File Storage
  119. ~~~~~~~~~~~~
  120. * ...
  121. File Uploads
  122. ~~~~~~~~~~~~
  123. * ...
  124. Forms
  125. ~~~~~
  126. * In order to improve accessibility and enable screen readers to associate
  127. fieldsets with their help text, the form fieldset now includes the
  128. ``aria-describedby`` HTML attribute.
  129. Generic Views
  130. ~~~~~~~~~~~~~
  131. * ...
  132. Internationalization
  133. ~~~~~~~~~~~~~~~~~~~~
  134. * ...
  135. Logging
  136. ~~~~~~~
  137. * ...
  138. Management Commands
  139. ~~~~~~~~~~~~~~~~~~~
  140. * :djadmin:`makemigrations` command now displays meaningful symbols for each
  141. operation to highlight :class:`operation categories
  142. <django.db.migrations.operations.base.OperationCategory>`.
  143. Migrations
  144. ~~~~~~~~~~
  145. * The new ``Operation.category`` attribute allows specifying an
  146. :class:`operation category
  147. <django.db.migrations.operations.base.OperationCategory>` used by the
  148. :djadmin:`makemigrations` to display a meaningful symbol for the operation.
  149. Models
  150. ~~~~~~
  151. * :meth:`.QuerySet.explain` now supports the ``generic_plan`` option on
  152. PostgreSQL 16+.
  153. * :class:`~django.db.models.expressions.RowRange` now accepts positive integers
  154. for the ``start`` argument and negative integers for the ``end`` argument.
  155. * The new ``exclusion`` argument of
  156. :class:`~django.db.models.expressions.RowRange` and
  157. :class:`~django.db.models.expressions.ValueRange` allows excluding rows,
  158. groups, and ties from the window frames.
  159. * :meth:`.QuerySet.order_by` now supports ordering by annotation transforms
  160. such as ``JSONObject`` keys and ``ArrayAgg`` indices.
  161. * :class:`F() <django.db.models.F>` and :class:`OuterRef()
  162. <django.db.models.OuterRef>` expressions that output
  163. :class:`~django.db.models.CharField`, :class:`~django.db.models.EmailField`,
  164. :class:`~django.db.models.SlugField`, :class:`~django.db.models.URLField`,
  165. :class:`~django.db.models.TextField`, or
  166. :class:`~django.contrib.postgres.fields.ArrayField` can now be :ref:`sliced
  167. <slicing-using-f>`.
  168. * The new ``from_queryset`` argument of :meth:`.Model.refresh_from_db` and
  169. :meth:`.Model.arefresh_from_db` allows customizing the queryset used to
  170. reload a model's value. This can be used to lock the row before reloading or
  171. to select related objects.
  172. * The new ``"transaction_mode"`` option is now supported in :setting:`OPTIONS`
  173. on SQLite to allow specifying the :ref:`sqlite-transaction-behavior`.
  174. Requests and Responses
  175. ~~~~~~~~~~~~~~~~~~~~~~
  176. * ...
  177. Security
  178. ~~~~~~~~
  179. * ...
  180. Serialization
  181. ~~~~~~~~~~~~~
  182. * ...
  183. Signals
  184. ~~~~~~~
  185. * ...
  186. Templates
  187. ~~~~~~~~~
  188. * Custom tags may now set extra data on the ``Parser`` object that will later
  189. be made available on the ``Template`` instance. Such data may be used, for
  190. example, by the template loader, or other template clients.
  191. * The new :ttag:`{% query_string %} <query_string>` template tag allows
  192. changing a :class:`~django.http.QueryDict` instance for use in links, for
  193. example, to generate a link to the next page while keeping any filtering
  194. options in place.
  195. Tests
  196. ~~~~~
  197. * :meth:`~django.test.SimpleTestCase.assertContains`,
  198. :meth:`~django.test.SimpleTestCase.assertNotContains`, and
  199. :meth:`~django.test.SimpleTestCase.assertInHTML` assertions now add haystacks
  200. to assertion error messages.
  201. * The :class:`~django.test.RequestFactory`,
  202. :class:`~django.test.AsyncRequestFactory`, :class:`~django.test.Client`, and
  203. :class:`~django.test.AsyncClient` classes now support the ``query_params``
  204. parameter, which accepts a dictionary of query string keys and values. This
  205. allows setting query strings on any HTTP methods more easily.
  206. .. code-block:: python
  207. self.client.post("/items/1", query_params={"action": "delete"})
  208. await self.async_client.post("/items/1", query_params={"action": "delete"})
  209. * The new :meth:`.SimpleTestCase.assertNotInHTML` assertion allows testing that
  210. an HTML fragment is not contained in the given HTML haystack.
  211. * In order to enforce test isolation, database connections inside threads are
  212. no longer allowed in :class:`~django.test.SimpleTestCase`.
  213. URLs
  214. ~~~~
  215. * ...
  216. Utilities
  217. ~~~~~~~~~
  218. * ...
  219. Validators
  220. ~~~~~~~~~~
  221. * ...
  222. .. _backwards-incompatible-5.1:
  223. Backwards incompatible changes in 5.1
  224. =====================================
  225. Database backend API
  226. --------------------
  227. This section describes changes that may be needed in third-party database
  228. backends.
  229. * ...
  230. :mod:`django.contrib.gis`
  231. -------------------------
  232. * Support for PostGIS 2.5 is removed.
  233. * Support for PROJ < 6 is removed.
  234. * Support for GDAL 2.4 is removed.
  235. * :class:`~django.contrib.gis.geoip2.GeoIP2` no longer opens both city and
  236. country databases when a directory path is provided, preferring the city
  237. database, if it is available. The country database is a subset of the city
  238. database and both are not typically needed. If you require use of the country
  239. database when in the same directory as the city database, explicitly pass the
  240. country database path to the constructor.
  241. Dropped support for MariaDB 10.4
  242. --------------------------------
  243. Upstream support for MariaDB 10.4 ends in June 2024. Django 5.1 supports
  244. MariaDB 10.5 and higher.
  245. Dropped support for PostgreSQL 12
  246. ---------------------------------
  247. Upstream support for PostgreSQL 12 ends in November 2024. Django 5.1 supports
  248. PostgreSQL 13 and higher.
  249. Miscellaneous
  250. -------------
  251. * In order to improve accessibility, the admin's changelist filter is now
  252. rendered in a ``<nav>`` tag instead of a ``<div>``.
  253. * In order to improve accessibility, the admin's footer is now rendered in
  254. a ``<footer>`` tag instead of a ``<div>``, and also moved below the
  255. ``<div id="main">`` element.
  256. * :meth:`.SimpleTestCase.assertURLEqual` and
  257. :meth:`~django.test.SimpleTestCase.assertInHTML` now add ``": "`` to the
  258. ``msg_prefix``. This is consistent with the behavior of other assertions.
  259. * ``django.utils.text.Truncator`` used by :tfilter:`truncatechars_html` and
  260. :tfilter:`truncatewords_html` template filters now uses
  261. :py:class:`html.parser.HTMLParser` subclasses. This results in a more robust
  262. and faster operation, but there may be small differences in the output.
  263. .. _deprecated-features-5.1:
  264. Features deprecated in 5.1
  265. ==========================
  266. Miscellaneous
  267. -------------
  268. * The ``ModelAdmin.log_deletion()`` and ``LogEntryManager.log_action()``
  269. methods are deprecated. Subclasses should implement
  270. ``ModelAdmin.log_deletions()`` and ``LogEntryManager.log_actions()``
  271. instead.
  272. * The undocumented ``django.utils.itercompat.is_iterable()`` function and the
  273. ``django.utils.itercompat`` module are deprecated. Use
  274. ``isinstance(..., collections.abc.Iterable)`` instead.
  275. * The ``django.contrib.gis.geoip2.GeoIP2.coords()`` method is deprecated. Use
  276. ``django.contrib.gis.geoip2.GeoIP2.lon_lat()`` instead.
  277. * The ``django.contrib.gis.geoip2.GeoIP2.open()`` method is deprecated. Use the
  278. :class:`~django.contrib.gis.geoip2.GeoIP2` constructor instead.
  279. * Passing positional arguments to :meth:`.Model.save` and :meth:`.Model.asave`
  280. is deprecated in favor of keyword-only arguments.
  281. * Setting ``django.contrib.gis.gdal.OGRGeometry.coord_dim`` is deprecated. Use
  282. :meth:`~django.contrib.gis.gdal.OGRGeometry.set_3d` instead.
  283. Features removed in 5.1
  284. =======================
  285. These features have reached the end of their deprecation cycle and are removed
  286. in Django 5.1.
  287. See :ref:`deprecated-features-4.2` for details on these changes, including how
  288. to remove usage of these features.
  289. * The ``BaseUserManager.make_random_password()`` method is removed.
  290. * The model's ``Meta.index_together`` option is removed.
  291. * The ``length_is`` template filter is removed.
  292. * The ``django.contrib.auth.hashers.SHA1PasswordHasher``,
  293. ``django.contrib.auth.hashers.UnsaltedSHA1PasswordHasher``, and
  294. ``django.contrib.auth.hashers.UnsaltedMD5PasswordHasher`` are removed.
  295. * The model ``django.contrib.postgres.fields.CICharField``,
  296. ``django.contrib.postgres.fields.CIEmailField``, and
  297. ``django.contrib.postgres.fields.CITextField`` are removed, except for
  298. support in historical migrations.
  299. * The ``django.contrib.postgres.fields.CIText`` mixin is removed.
  300. * The ``map_width`` and ``map_height`` attributes of ``BaseGeometryWidget`` are
  301. removed.
  302. * The ``SimpleTestCase.assertFormsetError()`` method is removed.
  303. * The ``TransactionTestCase.assertQuerysetEqual()`` method is removed.
  304. * Support for passing encoded JSON string literals to ``JSONField`` and
  305. associated lookups and expressions is removed.
  306. * Support for passing positional arguments to ``Signer`` and
  307. ``TimestampSigner`` is removed.
  308. * The ``DEFAULT_FILE_STORAGE`` and ``STATICFILES_STORAGE`` settings is removed.
  309. * The ``django.core.files.storage.get_storage_class()`` function is removed.