4.2.txt 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  1. ============================================
  2. Django 4.2 release notes - UNDER DEVELOPMENT
  3. ============================================
  4. *Expected April 2023*
  5. Welcome to Django 4.2!
  6. These release notes cover the :ref:`new features <whats-new-4.2>`, as well as
  7. some :ref:`backwards incompatible changes <backwards-incompatible-4.2>` you'll
  8. want to be aware of when upgrading from Django 4.1 or earlier. We've
  9. :ref:`begun the deprecation process for some features
  10. <deprecated-features-4.2>`.
  11. See the :doc:`/howto/upgrade-version` guide if you're updating an existing
  12. project.
  13. Python compatibility
  14. ====================
  15. Django 4.2 supports Python 3.8, 3.9, 3.10, and 3.11. We **highly recommend**
  16. and only officially support the latest release of each series.
  17. .. _whats-new-4.2:
  18. What's new in Django 4.2
  19. ========================
  20. Minor features
  21. --------------
  22. :mod:`django.contrib.admin`
  23. ~~~~~~~~~~~~~~~~~~~~~~~~~~~
  24. * The light or dark color theme of the admin can now be toggled in the UI, as
  25. well as being set to follow the system setting.
  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. 390,000 to 480,000.
  33. :mod:`django.contrib.contenttypes`
  34. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  35. * ...
  36. :mod:`django.contrib.gis`
  37. ~~~~~~~~~~~~~~~~~~~~~~~~~
  38. * The :doc:`GeoJSON serializer </ref/contrib/gis/serializers>` now outputs the
  39. ``id`` key for serialized features, which defaults to the primary key of
  40. objects.
  41. * The :class:`~django.contrib.gis.gdal.GDALRaster` class now supports
  42. :class:`pathlib.Path`.
  43. * The :class:`~django.contrib.gis.geoip2.GeoIP2` class now supports ``.mmdb``
  44. files downloaded from DB-IP.
  45. * The OpenLayers template widget no longer includes inline CSS (which also
  46. removes the former ``map_css`` block) to better comply with a strict Content
  47. Security Policy.
  48. :mod:`django.contrib.messages`
  49. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  50. * ...
  51. :mod:`django.contrib.postgres`
  52. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  53. * The new :lookup:`trigram_strict_word_similar` lookup, and the
  54. :class:`TrigramStrictWordSimilarity()
  55. <django.contrib.postgres.search.TrigramStrictWordSimilarity>` and
  56. :class:`TrigramStrictWordDistance()
  57. <django.contrib.postgres.search.TrigramStrictWordDistance>` expressions allow
  58. using trigram strict word similarity.
  59. :mod:`django.contrib.redirects`
  60. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  61. * ...
  62. :mod:`django.contrib.sessions`
  63. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  64. * ...
  65. :mod:`django.contrib.sitemaps`
  66. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  67. * ...
  68. :mod:`django.contrib.sites`
  69. ~~~~~~~~~~~~~~~~~~~~~~~~~~~
  70. * ...
  71. :mod:`django.contrib.staticfiles`
  72. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  73. * ...
  74. :mod:`django.contrib.syndication`
  75. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  76. * ...
  77. Cache
  78. ~~~~~
  79. * ...
  80. CSRF
  81. ~~~~
  82. * ...
  83. Decorators
  84. ~~~~~~~~~~
  85. * ...
  86. Email
  87. ~~~~~
  88. * ...
  89. Error Reporting
  90. ~~~~~~~~~~~~~~~
  91. * ...
  92. File Storage
  93. ~~~~~~~~~~~~
  94. * ...
  95. File Uploads
  96. ~~~~~~~~~~~~
  97. * ...
  98. Forms
  99. ~~~~~
  100. * ...
  101. Generic Views
  102. ~~~~~~~~~~~~~
  103. * ...
  104. Internationalization
  105. ~~~~~~~~~~~~~~~~~~~~
  106. * ...
  107. Logging
  108. ~~~~~~~
  109. * ...
  110. Management Commands
  111. ~~~~~~~~~~~~~~~~~~~
  112. * :djadmin:`makemessages` command now supports locales with private sub-tags
  113. such as ``nl_NL-x-informal``.
  114. * The new :option:`makemigrations --update` option merges model changes into
  115. the latest migration and optimizes the resulting operations.
  116. Migrations
  117. ~~~~~~~~~~
  118. * ...
  119. Models
  120. ~~~~~~
  121. * ...
  122. Requests and Responses
  123. ~~~~~~~~~~~~~~~~~~~~~~
  124. * ...
  125. Security
  126. ~~~~~~~~
  127. * ...
  128. Serialization
  129. ~~~~~~~~~~~~~
  130. * ...
  131. Signals
  132. ~~~~~~~
  133. * ...
  134. Templates
  135. ~~~~~~~~~
  136. * ...
  137. Tests
  138. ~~~~~
  139. * ...
  140. URLs
  141. ~~~~
  142. * ...
  143. Utilities
  144. ~~~~~~~~~
  145. * The new ``encoder`` parameter for :meth:`django.utils.html.json_script`
  146. function allows customizing a JSON encoder class.
  147. * The private internal vendored copy of ``urllib.parse.urlsplit()`` now strips
  148. ``'\r'``, ``'\n'``, and ``'\t'`` (see :cve:`2022-0391` and :bpo:`43882`).
  149. This is to protect projects that may be incorrectly using the internal
  150. ``url_has_allowed_host_and_scheme()`` function, instead of using one of the
  151. documented functions for handling URL redirects. The Django functions were
  152. not affected.
  153. Validators
  154. ~~~~~~~~~~
  155. * ...
  156. .. _backwards-incompatible-4.2:
  157. Backwards incompatible changes in 4.2
  158. =====================================
  159. Database backend API
  160. --------------------
  161. This section describes changes that may be needed in third-party database
  162. backends.
  163. * ...
  164. Dropped support for MariaDB 10.3
  165. --------------------------------
  166. Upstream support for MariaDB 10.3 ends in May 2023. Django 4.2 supports MariaDB
  167. 10.4 and higher.
  168. Dropped support for MySQL 5.7
  169. -----------------------------
  170. Upstream support for MySQL 5.7 ends in October 2023. Django 4.2 supports MySQL
  171. 8 and higher.
  172. Dropped support for PostgreSQL 11
  173. ---------------------------------
  174. Upstream support for PostgreSQL 11 ends in November 2023. Django 4.2 supports
  175. PostgreSQL 12 and higher.
  176. Miscellaneous
  177. -------------
  178. * The undocumented ``SimpleTemplateResponse.rendering_attrs`` and
  179. ``TemplateResponse.rendering_attrs`` are renamed to ``non_picklable_attrs``.
  180. * The undocumented ``django.http.multipartparser.parse_header()`` function is
  181. removed. Use ``django.utils.http.parse_header_parameters()`` instead.
  182. * :ttag:`{% blocktranslate asvar … %}<blocktranslate>` result is now marked as
  183. safe for (HTML) output purposes.
  184. .. _deprecated-features-4.2:
  185. Features deprecated in 4.2
  186. ==========================
  187. ``index_together`` option is deprecated in favor of ``indexes``
  188. ---------------------------------------------------------------
  189. The :attr:`Meta.index_together <django.db.models.Options.index_together>`
  190. option is deprecated in favor of the :attr:`~django.db.models.Options.indexes`
  191. option.
  192. Migrating existing ``index_together`` should be handled as a migration. For
  193. example::
  194. class Author(models.Model):
  195. rank = models.IntegerField()
  196. name = models.CharField(max_length=30)
  197. class Meta:
  198. index_together = [["rank", "name"]]
  199. Should become::
  200. class Author(models.Model):
  201. ranl = models.IntegerField()
  202. name = models.CharField(max_length=30)
  203. class Meta:
  204. indexes = [models.Index(fields=["rank", "name"])]
  205. Running the :djadmin:`makemigrations` command will generate a migration
  206. containing a :class:`~django.db.migrations.operations.RenameIndex` operation
  207. which will rename the existing index.
  208. The ``AlterIndexTogether`` migration operation is now officially supported only
  209. for pre-Django 4.2 migration files. For backward compatibility reasons, it's
  210. still part of the public API, and there's no plan to deprecate or remove it,
  211. but it should not be used for new migrations. Use
  212. :class:`~django.db.migrations.operations.AddIndex` and
  213. :class:`~django.db.migrations.operations.RemoveIndex` operations instead.
  214. Miscellaneous
  215. -------------
  216. * The ``BaseUserManager.make_random_password()`` method is deprecated. See
  217. `recipes and best practices
  218. <https://docs.python.org/3/library/secrets.html#recipes-and-best-practices>`_
  219. for using Python's :py:mod:`secrets` module to generate passwords.
  220. * The ``length_is`` template filter is deprecated in favor of :tfilter:`length`
  221. and the ``==`` operator within an :ttag:`{% if %}<if>` tag. For example
  222. .. code-block:: html+django
  223. {% if value|length == 4 %}…{% endif %}
  224. {% if value|length == 4 %}True{% else %}False{% endif %}
  225. instead of:
  226. .. code-block:: html+django
  227. {% if value|length_is:4 %}…{% endif %}
  228. {{ value|length_is:4 }}
  229. * ``django.contrib.auth.hashers.SHA1PasswordHasher``,
  230. ``django.contrib.auth.hashers.UnsaltedSHA1PasswordHasher``, and
  231. ``django.contrib.auth.hashers.UnsaltedMD5PasswordHasher`` are deprecated.
  232. * ``django.contrib.postgres.fields.CICharField`` is deprecated in favor of
  233. ``CharField(db_collation="…")`` with a case-insensitive non-deterministic
  234. collation.
  235. * ``django.contrib.postgres.fields.CIEmailField`` is deprecated in favor of
  236. ``EmailField(db_collation="…")`` with a case-insensitive non-deterministic
  237. collation.
  238. * ``django.contrib.postgres.fields.CITextField`` is deprecated in favor of
  239. ``TextField(db_collation="…")`` with a case-insensitive non-deterministic
  240. collation.
  241. * ``django.contrib.postgres.fields.CIText`` mixin is deprecated.