2022-05-10 12:42:13 +00:00
|
|
|
|
============================================
|
|
|
|
|
Django 4.2 release notes - UNDER DEVELOPMENT
|
|
|
|
|
============================================
|
|
|
|
|
|
|
|
|
|
*Expected April 2023*
|
|
|
|
|
|
|
|
|
|
Welcome to Django 4.2!
|
|
|
|
|
|
|
|
|
|
These release notes cover the :ref:`new features <whats-new-4.2>`, as well as
|
|
|
|
|
some :ref:`backwards incompatible changes <backwards-incompatible-4.2>` you'll
|
|
|
|
|
want to be aware of when upgrading from Django 4.1 or earlier. We've
|
|
|
|
|
:ref:`begun the deprecation process for some features
|
|
|
|
|
<deprecated-features-4.2>`.
|
|
|
|
|
|
|
|
|
|
See the :doc:`/howto/upgrade-version` guide if you're updating an existing
|
|
|
|
|
project.
|
|
|
|
|
|
|
|
|
|
Python compatibility
|
|
|
|
|
====================
|
|
|
|
|
|
|
|
|
|
Django 4.2 supports Python 3.8, 3.9, 3.10, and 3.11. We **highly recommend**
|
|
|
|
|
and only officially support the latest release of each series.
|
|
|
|
|
|
|
|
|
|
.. _whats-new-4.2:
|
|
|
|
|
|
|
|
|
|
What's new in Django 4.2
|
|
|
|
|
========================
|
|
|
|
|
|
|
|
|
|
Minor features
|
|
|
|
|
--------------
|
|
|
|
|
|
|
|
|
|
:mod:`django.contrib.admin`
|
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
2022-07-13 11:51:06 +00:00
|
|
|
|
* The light or dark color theme of the admin can now be toggled in the UI, as
|
|
|
|
|
well as being set to follow the system setting.
|
2022-05-10 12:42:13 +00:00
|
|
|
|
|
2022-08-16 13:44:10 +00:00
|
|
|
|
* The admin's font stack now prefers system UI fonts and no longer requires
|
|
|
|
|
downloading fonts. Additionally, CSS variables are available to more easily
|
|
|
|
|
override the default font families.
|
|
|
|
|
|
2022-08-17 22:57:24 +00:00
|
|
|
|
* The :source:`admin/delete_confirmation.html
|
|
|
|
|
<django/contrib/admin/templates/admin/delete_confirmation.html>` template now
|
|
|
|
|
has some additional blocks and scripting hooks to ease customization.
|
|
|
|
|
|
2022-08-25 19:50:31 +00:00
|
|
|
|
* The chosen options of
|
|
|
|
|
:attr:`~django.contrib.admin.ModelAdmin.filter_horizontal` and
|
|
|
|
|
:attr:`~django.contrib.admin.ModelAdmin.filter_vertical` widgets are now
|
|
|
|
|
filterable.
|
|
|
|
|
|
2022-05-10 12:42:13 +00:00
|
|
|
|
:mod:`django.contrib.admindocs`
|
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
|
|
:mod:`django.contrib.auth`
|
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
2022-05-10 13:26:17 +00:00
|
|
|
|
* The default iteration count for the PBKDF2 password hasher is increased from
|
|
|
|
|
390,000 to 480,000.
|
2022-05-10 12:42:13 +00:00
|
|
|
|
|
|
|
|
|
:mod:`django.contrib.contenttypes`
|
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
|
|
:mod:`django.contrib.gis`
|
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
2022-05-28 09:33:15 +00:00
|
|
|
|
* The :doc:`GeoJSON serializer </ref/contrib/gis/serializers>` now outputs the
|
|
|
|
|
``id`` key for serialized features, which defaults to the primary key of
|
|
|
|
|
objects.
|
2022-05-10 12:42:13 +00:00
|
|
|
|
|
2022-07-25 16:33:25 +00:00
|
|
|
|
* The :class:`~django.contrib.gis.gdal.GDALRaster` class now supports
|
|
|
|
|
:class:`pathlib.Path`.
|
|
|
|
|
|
2022-07-29 16:34:18 +00:00
|
|
|
|
* The :class:`~django.contrib.gis.geoip2.GeoIP2` class now supports ``.mmdb``
|
|
|
|
|
files downloaded from DB-IP.
|
|
|
|
|
|
2022-07-30 21:52:17 +00:00
|
|
|
|
* The OpenLayers template widget no longer includes inline CSS (which also
|
|
|
|
|
removes the former ``map_css`` block) to better comply with a strict Content
|
|
|
|
|
Security Policy.
|
|
|
|
|
|
2022-05-10 12:42:13 +00:00
|
|
|
|
:mod:`django.contrib.messages`
|
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
|
|
:mod:`django.contrib.postgres`
|
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
2022-06-17 07:44:03 +00:00
|
|
|
|
* The new :lookup:`trigram_strict_word_similar` lookup, and the
|
|
|
|
|
:class:`TrigramStrictWordSimilarity()
|
|
|
|
|
<django.contrib.postgres.search.TrigramStrictWordSimilarity>` and
|
|
|
|
|
:class:`TrigramStrictWordDistance()
|
|
|
|
|
<django.contrib.postgres.search.TrigramStrictWordDistance>` expressions allow
|
|
|
|
|
using trigram strict word similarity.
|
2022-05-10 12:42:13 +00:00
|
|
|
|
|
|
|
|
|
:mod:`django.contrib.redirects`
|
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
|
|
:mod:`django.contrib.sessions`
|
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
|
|
:mod:`django.contrib.sitemaps`
|
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
|
|
:mod:`django.contrib.sites`
|
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
|
|
:mod:`django.contrib.staticfiles`
|
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
|
|
:mod:`django.contrib.syndication`
|
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
|
|
Cache
|
|
|
|
|
~~~~~
|
|
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
|
|
CSRF
|
|
|
|
|
~~~~
|
|
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
|
|
Decorators
|
|
|
|
|
~~~~~~~~~~
|
|
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
|
|
Email
|
|
|
|
|
~~~~~
|
|
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
|
|
Error Reporting
|
|
|
|
|
~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
|
|
File Storage
|
|
|
|
|
~~~~~~~~~~~~
|
|
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
|
|
File Uploads
|
|
|
|
|
~~~~~~~~~~~~
|
|
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
|
|
Forms
|
|
|
|
|
~~~~~
|
|
|
|
|
|
2022-08-04 18:39:12 +00:00
|
|
|
|
* :class:`~django.forms.ModelForm` now accepts the new ``Meta`` option
|
|
|
|
|
``formfield_callback`` to customize form fields.
|
|
|
|
|
|
|
|
|
|
* :func:`~django.forms.models.modelform_factory` now respects the
|
|
|
|
|
``formfield_callback`` attribute of the ``form``’s ``Meta``.
|
2022-05-10 12:42:13 +00:00
|
|
|
|
|
|
|
|
|
Generic Views
|
|
|
|
|
~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
|
|
Internationalization
|
|
|
|
|
~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
2022-08-13 09:36:15 +00:00
|
|
|
|
* Added support and translations for the Central Kurdish (Sorani) language.
|
2022-05-10 12:42:13 +00:00
|
|
|
|
|
|
|
|
|
Logging
|
|
|
|
|
~~~~~~~
|
|
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
|
|
Management Commands
|
|
|
|
|
~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
2022-03-17 11:02:59 +00:00
|
|
|
|
* :djadmin:`makemessages` command now supports locales with private sub-tags
|
|
|
|
|
such as ``nl_NL-x-informal``.
|
2022-05-10 12:42:13 +00:00
|
|
|
|
|
2022-06-14 18:12:20 +00:00
|
|
|
|
* The new :option:`makemigrations --update` option merges model changes into
|
|
|
|
|
the latest migration and optimizes the resulting operations.
|
|
|
|
|
|
2022-05-10 12:42:13 +00:00
|
|
|
|
Migrations
|
|
|
|
|
~~~~~~~~~~
|
|
|
|
|
|
2022-08-11 16:17:19 +00:00
|
|
|
|
* Migrations now support serialization of ``enum.Flag`` objects.
|
2022-05-10 12:42:13 +00:00
|
|
|
|
|
|
|
|
|
Models
|
|
|
|
|
~~~~~~
|
|
|
|
|
|
2022-08-10 12:22:01 +00:00
|
|
|
|
* ``QuerySet`` now extensively supports filtering against
|
|
|
|
|
:ref:`window-functions` with the exception of disjunctive filter lookups
|
|
|
|
|
against window functions when performing aggregation.
|
2022-05-10 12:42:13 +00:00
|
|
|
|
|
2022-08-13 06:14:19 +00:00
|
|
|
|
* :meth:`~.QuerySet.prefetch_related` now supports
|
|
|
|
|
:class:`~django.db.models.Prefetch` objects with sliced querysets.
|
|
|
|
|
|
2022-06-23 06:32:53 +00:00
|
|
|
|
* :ref:`Registering lookups <lookup-registration-api>` on
|
|
|
|
|
:class:`~django.db.models.Field` instances is now supported.
|
|
|
|
|
|
2022-06-07 15:50:46 +00:00
|
|
|
|
* The new ``robust`` argument for :func:`~django.db.transaction.on_commit`
|
|
|
|
|
allows performing actions that can fail after a database transaction is
|
|
|
|
|
successfully committed.
|
|
|
|
|
|
2022-05-10 12:42:13 +00:00
|
|
|
|
Requests and Responses
|
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
|
|
Security
|
|
|
|
|
~~~~~~~~
|
|
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
|
|
Serialization
|
|
|
|
|
~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
|
|
Signals
|
|
|
|
|
~~~~~~~
|
|
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
|
|
Templates
|
|
|
|
|
~~~~~~~~~
|
|
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
|
|
Tests
|
|
|
|
|
~~~~~
|
|
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
|
|
URLs
|
|
|
|
|
~~~~
|
|
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
|
|
Utilities
|
|
|
|
|
~~~~~~~~~
|
|
|
|
|
|
2022-06-23 08:50:20 +00:00
|
|
|
|
* The new ``encoder`` parameter for :meth:`django.utils.html.json_script`
|
|
|
|
|
function allows customizing a JSON encoder class.
|
2022-05-10 12:42:13 +00:00
|
|
|
|
|
2022-06-30 00:39:51 +00:00
|
|
|
|
* The private internal vendored copy of ``urllib.parse.urlsplit()`` now strips
|
|
|
|
|
``'\r'``, ``'\n'``, and ``'\t'`` (see :cve:`2022-0391` and :bpo:`43882`).
|
|
|
|
|
This is to protect projects that may be incorrectly using the internal
|
|
|
|
|
``url_has_allowed_host_and_scheme()`` function, instead of using one of the
|
|
|
|
|
documented functions for handling URL redirects. The Django functions were
|
|
|
|
|
not affected.
|
|
|
|
|
|
2022-05-10 12:42:13 +00:00
|
|
|
|
Validators
|
|
|
|
|
~~~~~~~~~~
|
|
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
|
|
.. _backwards-incompatible-4.2:
|
|
|
|
|
|
|
|
|
|
Backwards incompatible changes in 4.2
|
|
|
|
|
=====================================
|
|
|
|
|
|
|
|
|
|
Database backend API
|
|
|
|
|
--------------------
|
|
|
|
|
|
|
|
|
|
This section describes changes that may be needed in third-party database
|
|
|
|
|
backends.
|
|
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
2022-05-18 06:38:08 +00:00
|
|
|
|
Dropped support for MariaDB 10.3
|
|
|
|
|
--------------------------------
|
|
|
|
|
|
|
|
|
|
Upstream support for MariaDB 10.3 ends in May 2023. Django 4.2 supports MariaDB
|
|
|
|
|
10.4 and higher.
|
|
|
|
|
|
2022-07-08 11:30:12 +00:00
|
|
|
|
Dropped support for MySQL 5.7
|
|
|
|
|
-----------------------------
|
|
|
|
|
|
|
|
|
|
Upstream support for MySQL 5.7 ends in October 2023. Django 4.2 supports MySQL
|
|
|
|
|
8 and higher.
|
|
|
|
|
|
2022-05-19 07:26:48 +00:00
|
|
|
|
Dropped support for PostgreSQL 11
|
|
|
|
|
---------------------------------
|
|
|
|
|
|
|
|
|
|
Upstream support for PostgreSQL 11 ends in November 2023. Django 4.2 supports
|
|
|
|
|
PostgreSQL 12 and higher.
|
|
|
|
|
|
2022-05-10 12:42:13 +00:00
|
|
|
|
Miscellaneous
|
|
|
|
|
-------------
|
|
|
|
|
|
2022-06-16 16:04:13 +00:00
|
|
|
|
* The undocumented ``SimpleTemplateResponse.rendering_attrs`` and
|
|
|
|
|
``TemplateResponse.rendering_attrs`` are renamed to ``non_picklable_attrs``.
|
2022-05-10 12:42:13 +00:00
|
|
|
|
|
2022-06-28 19:45:03 +00:00
|
|
|
|
* The undocumented ``django.http.multipartparser.parse_header()`` function is
|
|
|
|
|
removed. Use ``django.utils.http.parse_header_parameters()`` instead.
|
|
|
|
|
|
2022-07-14 06:11:17 +00:00
|
|
|
|
* :ttag:`{% blocktranslate asvar … %}<blocktranslate>` result is now marked as
|
|
|
|
|
safe for (HTML) output purposes.
|
|
|
|
|
|
2022-05-10 12:42:13 +00:00
|
|
|
|
.. _deprecated-features-4.2:
|
|
|
|
|
|
|
|
|
|
Features deprecated in 4.2
|
|
|
|
|
==========================
|
|
|
|
|
|
2022-05-17 14:13:35 +00:00
|
|
|
|
``index_together`` option is deprecated in favor of ``indexes``
|
|
|
|
|
---------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
The :attr:`Meta.index_together <django.db.models.Options.index_together>`
|
|
|
|
|
option is deprecated in favor of the :attr:`~django.db.models.Options.indexes`
|
|
|
|
|
option.
|
|
|
|
|
|
|
|
|
|
Migrating existing ``index_together`` should be handled as a migration. For
|
|
|
|
|
example::
|
|
|
|
|
|
|
|
|
|
class Author(models.Model):
|
|
|
|
|
rank = models.IntegerField()
|
|
|
|
|
name = models.CharField(max_length=30)
|
|
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
|
index_together = [["rank", "name"]]
|
|
|
|
|
|
|
|
|
|
Should become::
|
|
|
|
|
|
|
|
|
|
class Author(models.Model):
|
2022-08-03 16:40:42 +00:00
|
|
|
|
rank = models.IntegerField()
|
2022-05-17 14:13:35 +00:00
|
|
|
|
name = models.CharField(max_length=30)
|
|
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
|
indexes = [models.Index(fields=["rank", "name"])]
|
|
|
|
|
|
|
|
|
|
Running the :djadmin:`makemigrations` command will generate a migration
|
|
|
|
|
containing a :class:`~django.db.migrations.operations.RenameIndex` operation
|
|
|
|
|
which will rename the existing index.
|
|
|
|
|
|
2022-07-20 05:56:02 +00:00
|
|
|
|
The ``AlterIndexTogether`` migration operation is now officially supported only
|
|
|
|
|
for pre-Django 4.2 migration files. For backward compatibility reasons, it's
|
|
|
|
|
still part of the public API, and there's no plan to deprecate or remove it,
|
|
|
|
|
but it should not be used for new migrations. Use
|
|
|
|
|
:class:`~django.db.migrations.operations.AddIndex` and
|
|
|
|
|
:class:`~django.db.migrations.operations.RemoveIndex` operations instead.
|
|
|
|
|
|
2022-05-10 12:42:13 +00:00
|
|
|
|
Miscellaneous
|
|
|
|
|
-------------
|
|
|
|
|
|
2022-06-02 13:40:20 +00:00
|
|
|
|
* The ``BaseUserManager.make_random_password()`` method is deprecated. See
|
|
|
|
|
`recipes and best practices
|
|
|
|
|
<https://docs.python.org/3/library/secrets.html#recipes-and-best-practices>`_
|
|
|
|
|
for using Python's :py:mod:`secrets` module to generate passwords.
|
2022-05-17 14:13:35 +00:00
|
|
|
|
|
2021-04-22 15:55:59 +00:00
|
|
|
|
* The ``length_is`` template filter is deprecated in favor of :tfilter:`length`
|
|
|
|
|
and the ``==`` operator within an :ttag:`{% if %}<if>` tag. For example
|
|
|
|
|
|
|
|
|
|
.. code-block:: html+django
|
|
|
|
|
|
|
|
|
|
{% if value|length == 4 %}…{% endif %}
|
|
|
|
|
{% if value|length == 4 %}True{% else %}False{% endif %}
|
|
|
|
|
|
|
|
|
|
instead of:
|
|
|
|
|
|
|
|
|
|
.. code-block:: html+django
|
|
|
|
|
|
|
|
|
|
{% if value|length_is:4 %}…{% endif %}
|
|
|
|
|
{{ value|length_is:4 }}
|
2022-07-23 10:45:24 +00:00
|
|
|
|
|
|
|
|
|
* ``django.contrib.auth.hashers.SHA1PasswordHasher``,
|
|
|
|
|
``django.contrib.auth.hashers.UnsaltedSHA1PasswordHasher``, and
|
|
|
|
|
``django.contrib.auth.hashers.UnsaltedMD5PasswordHasher`` are deprecated.
|
2022-08-03 09:42:51 +00:00
|
|
|
|
|
|
|
|
|
* ``django.contrib.postgres.fields.CICharField`` is deprecated in favor of
|
|
|
|
|
``CharField(db_collation="…")`` with a case-insensitive non-deterministic
|
|
|
|
|
collation.
|
|
|
|
|
|
|
|
|
|
* ``django.contrib.postgres.fields.CIEmailField`` is deprecated in favor of
|
|
|
|
|
``EmailField(db_collation="…")`` with a case-insensitive non-deterministic
|
|
|
|
|
collation.
|
|
|
|
|
|
|
|
|
|
* ``django.contrib.postgres.fields.CITextField`` is deprecated in favor of
|
|
|
|
|
``TextField(db_collation="…")`` with a case-insensitive non-deterministic
|
|
|
|
|
collation.
|
|
|
|
|
|
|
|
|
|
* ``django.contrib.postgres.fields.CIText`` mixin is deprecated.
|
2022-08-12 10:18:51 +00:00
|
|
|
|
|
|
|
|
|
* The ``map_height`` and ``map_width`` attributes of ``BaseGeometryWidget`` are
|
|
|
|
|
deprecated, use CSS to size map widgets instead.
|