5.1.txt 17 KB

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