4.2.txt 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  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. * ...
  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. 390,000 to 480,000.
  32. :mod:`django.contrib.contenttypes`
  33. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  34. * ...
  35. :mod:`django.contrib.gis`
  36. ~~~~~~~~~~~~~~~~~~~~~~~~~
  37. * The :doc:`GeoJSON serializer </ref/contrib/gis/serializers>` now outputs the
  38. ``id`` key for serialized features, which defaults to the primary key of
  39. objects.
  40. :mod:`django.contrib.messages`
  41. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  42. * ...
  43. :mod:`django.contrib.postgres`
  44. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  45. * The new :lookup:`trigram_strict_word_similar` lookup, and the
  46. :class:`TrigramStrictWordSimilarity()
  47. <django.contrib.postgres.search.TrigramStrictWordSimilarity>` and
  48. :class:`TrigramStrictWordDistance()
  49. <django.contrib.postgres.search.TrigramStrictWordDistance>` expressions allow
  50. using trigram strict word similarity.
  51. :mod:`django.contrib.redirects`
  52. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  53. * ...
  54. :mod:`django.contrib.sessions`
  55. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  56. * ...
  57. :mod:`django.contrib.sitemaps`
  58. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  59. * ...
  60. :mod:`django.contrib.sites`
  61. ~~~~~~~~~~~~~~~~~~~~~~~~~~~
  62. * ...
  63. :mod:`django.contrib.staticfiles`
  64. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  65. * ...
  66. :mod:`django.contrib.syndication`
  67. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  68. * ...
  69. Cache
  70. ~~~~~
  71. * ...
  72. CSRF
  73. ~~~~
  74. * ...
  75. Decorators
  76. ~~~~~~~~~~
  77. * ...
  78. Email
  79. ~~~~~
  80. * ...
  81. Error Reporting
  82. ~~~~~~~~~~~~~~~
  83. * ...
  84. File Storage
  85. ~~~~~~~~~~~~
  86. * ...
  87. File Uploads
  88. ~~~~~~~~~~~~
  89. * ...
  90. Forms
  91. ~~~~~
  92. * ...
  93. Generic Views
  94. ~~~~~~~~~~~~~
  95. * ...
  96. Internationalization
  97. ~~~~~~~~~~~~~~~~~~~~
  98. * ...
  99. Logging
  100. ~~~~~~~
  101. * ...
  102. Management Commands
  103. ~~~~~~~~~~~~~~~~~~~
  104. * :djadmin:`makemessages` command now supports locales with private sub-tags
  105. such as ``nl_NL-x-informal``.
  106. * The new :option:`makemigrations --update` option merges model changes into
  107. the latest migration and optimizes the resulting operations.
  108. Migrations
  109. ~~~~~~~~~~
  110. * The new :ref:`generic mechanism <migrations-removing-operation>` allows
  111. handling the deprecation of migration operations.
  112. Models
  113. ~~~~~~
  114. * ...
  115. Requests and Responses
  116. ~~~~~~~~~~~~~~~~~~~~~~
  117. * ...
  118. Security
  119. ~~~~~~~~
  120. * ...
  121. Serialization
  122. ~~~~~~~~~~~~~
  123. * ...
  124. Signals
  125. ~~~~~~~
  126. * ...
  127. Templates
  128. ~~~~~~~~~
  129. * ...
  130. Tests
  131. ~~~~~
  132. * ...
  133. URLs
  134. ~~~~
  135. * ...
  136. Utilities
  137. ~~~~~~~~~
  138. * The new ``encoder`` parameter for :meth:`django.utils.html.json_script`
  139. function allows customizing a JSON encoder class.
  140. * The private internal vendored copy of ``urllib.parse.urlsplit()`` now strips
  141. ``'\r'``, ``'\n'``, and ``'\t'`` (see :cve:`2022-0391` and :bpo:`43882`).
  142. This is to protect projects that may be incorrectly using the internal
  143. ``url_has_allowed_host_and_scheme()`` function, instead of using one of the
  144. documented functions for handling URL redirects. The Django functions were
  145. not affected.
  146. Validators
  147. ~~~~~~~~~~
  148. * ...
  149. .. _backwards-incompatible-4.2:
  150. Backwards incompatible changes in 4.2
  151. =====================================
  152. Database backend API
  153. --------------------
  154. This section describes changes that may be needed in third-party database
  155. backends.
  156. * ...
  157. Dropped support for MariaDB 10.3
  158. --------------------------------
  159. Upstream support for MariaDB 10.3 ends in May 2023. Django 4.2 supports MariaDB
  160. 10.4 and higher.
  161. Dropped support for MySQL 5.7
  162. -----------------------------
  163. Upstream support for MySQL 5.7 ends in October 2023. Django 4.2 supports MySQL
  164. 8 and higher.
  165. Dropped support for PostgreSQL 11
  166. ---------------------------------
  167. Upstream support for PostgreSQL 11 ends in November 2023. Django 4.2 supports
  168. PostgreSQL 12 and higher.
  169. Miscellaneous
  170. -------------
  171. * The undocumented ``SimpleTemplateResponse.rendering_attrs`` and
  172. ``TemplateResponse.rendering_attrs`` are renamed to ``non_picklable_attrs``.
  173. * The undocumented ``django.http.multipartparser.parse_header()`` function is
  174. removed. Use ``django.utils.http.parse_header_parameters()`` instead.
  175. * :ttag:`{% blocktranslate asvar … %}<blocktranslate>` result is now marked as
  176. safe for (HTML) output purposes.
  177. .. _deprecated-features-4.2:
  178. Features deprecated in 4.2
  179. ==========================
  180. ``index_together`` option is deprecated in favor of ``indexes``
  181. ---------------------------------------------------------------
  182. The :attr:`Meta.index_together <django.db.models.Options.index_together>`
  183. option is deprecated in favor of the :attr:`~django.db.models.Options.indexes`
  184. option.
  185. Migrating existing ``index_together`` should be handled as a migration. For
  186. example::
  187. class Author(models.Model):
  188. rank = models.IntegerField()
  189. name = models.CharField(max_length=30)
  190. class Meta:
  191. index_together = [["rank", "name"]]
  192. Should become::
  193. class Author(models.Model):
  194. ranl = models.IntegerField()
  195. name = models.CharField(max_length=30)
  196. class Meta:
  197. indexes = [models.Index(fields=["rank", "name"])]
  198. Running the :djadmin:`makemigrations` command will generate a migration
  199. containing a :class:`~django.db.migrations.operations.RenameIndex` operation
  200. which will rename the existing index.
  201. Miscellaneous
  202. -------------
  203. * The ``BaseUserManager.make_random_password()`` method is deprecated. See
  204. `recipes and best practices
  205. <https://docs.python.org/3/library/secrets.html#recipes-and-best-practices>`_
  206. for using Python's :py:mod:`secrets` module to generate passwords.
  207. * The ``AlterIndexTogether`` migration operation is deprecated.
  208. * The ``length_is`` template filter is deprecated in favor of :tfilter:`length`
  209. and the ``==`` operator within an :ttag:`{% if %}<if>` tag. For example
  210. .. code-block:: html+django
  211. {% if value|length == 4 %}…{% endif %}
  212. {% if value|length == 4 %}True{% else %}False{% endif %}
  213. instead of:
  214. .. code-block:: html+django
  215. {% if value|length_is:4 %}…{% endif %}
  216. {{ value|length_is:4 }}