5.1.txt 12 KB

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