5.1.txt 18 KB

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