Notes de publication de Django 5.2Lien vers cette rubrique

April 2, 2025

Bienvenue dans Django 5.2 !

Ces notes de publications couvrent les nouvelles fonctionnalités, ainsi que certaines modifications non rétrocompatibles dont il faut être au courant lors de la mise à jour depuis Django 5.1 ou des versions plus anciennes. Nous avons commencé le processus d’obsolescence de certaines fonctionnalités.

Voir le guide Mise à jour de Django à une version plus récente si vous mettez à jour un projet existant.

Django 5.2 a été désigné comme une version prise en charge à long terme (LTS). Elle recevra des mises à jour de sécurité pour au moins 3 ans après sa publication initiale. La prise en charge de la version LTS précédente, Django 4.2, se terminera en avril 2026.

Compatibilité PythonLien vers cette rubrique

Django 5.2 supports Python 3.10, 3.11, 3.12, 3.13, and 3.14 (as of 5.2.8). We highly recommend and only officially support the latest release of each series.

Quoi de neuf dans Django 5.2Lien vers cette rubrique

Importation automatique des modèles dans le shellLien vers cette rubrique

La commande d’administration shell importe dorénavant automatiquement les modèles de toutes les applications installées. Il est possible d’afficher plus de détails sur les objets importés en définissant l’option --verbosity à 2 ou plus :

Linux / macOS

Shell
$ python -Wall manage.py shell --verbosity=2
6 objects imported automatically, including:

  from django.contrib.admin.models import LogEntry
  from django.contrib.auth.models import Group, Permission, User
  from django.contrib.contenttypes.models import ContentType
  from django.contrib.sessions.models import Session

Windows

Windows
...\> py -Wall manage.py shell --verbosity=2
6 objects imported automatically, including:

  from django.contrib.admin.models import LogEntry
  from django.contrib.auth.models import Group, Permission, User
  from django.contrib.contenttypes.models import ContentType
  from django.contrib.sessions.models import Session

Ce comportement peut être personnalisé pour ajouter ou enlever certaines importations automatiques.

Clés primaires compositesLien vers cette rubrique

Le nouveau champ django.db.models.CompositePrimaryKey permet de créer des tables avec une clé primaire formée de plusieurs champs.

Pour utiliser une clé primaire composite lors de la définition d’un modèle, définissez l’attribut pk à une clé CompositePrimaryKey:

Code
from django.db import models


class Release(models.Model):
    pk = models.CompositePrimaryKey("version", "name")
    version = models.IntegerField()
    name = models.CharField(max_length=20)

Voir Clés primaires composites pour plus de détails.

Surcharge simplifiée de BoundFieldLien vers cette rubrique

Prior to version 5.2, overriding Field.get_bound_field() was the only option to use a custom BoundField. Django now supports specifying the following attributes to customize form rendering:

For example, to customize the BoundField of a Form class:

Code
from django import forms


class CustomBoundField(forms.BoundField):

    custom_class = "custom"

    def css_classes(self, extra_classes=None):
        result = super().css_classes(extra_classes)
        if self.custom_class not in result:
            result += f" {self.custom_class}"
        return result.strip()


class CustomForm(forms.Form):
    bound_field_class = CustomBoundField

    name = forms.CharField(
        label="Your Name",
        max_length=100,
        required=False,
        widget=forms.TextInput(attrs={"class": "name-input-class"}),
    )
    email = forms.EmailField(label="Your Email")

When rendering a CustomForm instance, the following HTML is included:

Html
<div class="custom">
  <label for="id_name">Your Name:</label>
  <input type="text" name="name" class="name-input-class" maxlength="100" id="id_name">
</div>

<div class="custom">
  <label for="id_email">Your Email:</label>
  <input type="email" name="email" maxlength="320" required="" id="id_email">
</div>

See Personnalisation de BoundField for more details about this feature.

Fonctionnalités mineuresLien vers cette rubrique

django.contrib.adminLien vers cette rubrique

  • The admin/base.html template now has a new block extrabody for adding custom code before the closing </body> tag.

  • The value of a URLField now renders as a link.

django.contrib.admindocsLien vers cette rubrique

  • Links to components in docstrings now supports custom link text, using the format :role:`link text <link>`. See documentation helpers for more details.

  • The model pages are now restricted to users with the corresponding view or change permissions.

django.contrib.authLien vers cette rubrique

django.contrib.gisLien vers cette rubrique

django.contrib.syndicationLien vers cette rubrique

  • All SyndicationFeed classes now support a stylesheets attribute. If specified, an <? xml-stylesheet ?> processing instruction will be added to the top of the document for each stylesheet in the given list. See Feuilles de style des flux for more details.

Moteurs de base de donnéesLien vers cette rubrique

  • MySQL connections now default to using the utf8mb4 character set, instead of utf8, which is an alias for the deprecated character set utf8mb3.

  • Oracle backends now support connection pools, by setting "pool" in the OPTIONS part of your database configuration.

DécorateursLien vers cette rubrique

EmailLien vers cette rubrique

Signalement d’erreursLien vers cette rubrique

FormulairesLien vers cette rubrique

  • The new ColorInput form widget is for entering a color in rrggbb hexadecimal format and renders as <input type="color" ...>. Some browsers support a visual color picker interface for this input type.

  • The new SearchInput form widget is for entering search queries and renders as <input type="search" ...>.

  • The new TelInput form widget is for entering telephone numbers and renders as <input type="tel" ...>.

  • The new field_id argument for ErrorList allows an HTML id attribute to be added in the error template. See ErrorList.field_id for details.

  • An aria_describedby property is added to BoundField to ease use of this HTML attribute in templates.

  • To improve accessibility for screen reader users aria-describedby is used to associate form fields with their error messages. See how form errors are displayed for details.

  • The new asset object Script is available for adding custom HTML-attributes to JavaScript in form media. See paths as objects for more details.

Commandes d’administrationLien vers cette rubrique

  • A new warning is displayed when running runserver, indicating that it is unsuitable for production. This warning can be suppressed by setting the DJANGO_RUNSERVER_HIDE_WARNING environment variable to "true".

  • The makemigrations and migrate commands have a new Command.autodetector attribute for subclasses to override in order to use a custom autodetector class.

  • The new BaseCommand.get_check_kwargs() method can be overridden in custom commands to control the running of system checks, e.g. to opt into database-dependent checks.

MigrationsLien vers cette rubrique

  • The new operation AlterConstraint is a no-op operation that alters constraints without dropping and recreating constraints in the database.

ModèlesLien vers cette rubrique

  • The SELECT clause generated when using QuerySet.values() and QuerySet.values_list() now matches the specified order of the referenced expressions. Previously, the order was based on a set of counterintuitive rules which made query combination through methods such as QuerySet.union() unpredictable.

  • Added support for validation of model constraints which use a GeneratedField.

  • The new Expression.set_returning attribute specifies that the expression contains a set-returning function, enforcing subquery evaluation. This is necessary for many Postgres set-returning functions.

  • CharField.max_length is no longer required to be set on SQLite, which supports unlimited VARCHAR columns.

  • QuerySet.explain() now supports the memory and serialize options on PostgreSQL 17+.

  • The new JSONArray database function accepts a list of field names or expressions and returns a JSON array containing those values.

  • The new Expression.allows_composite_expressions attribute specifies that the expression allows composite expressions, for example, to support composite primary keys.

Requêtes et réponsesLien vers cette rubrique

SérialisationLien vers cette rubrique

  • Each serialization format now defines a Deserializer class, rather than a function, to improve extensibility when defining a custom serialization format.

GabaritsLien vers cette rubrique

  • The new simple_block_tag() decorator enables the creation of simple block tags, which can accept and use a section of the template.

TestsLien vers cette rubrique

  • Stack frames from Django’s custom assertions are now hidden. This makes test failures easier to read and enables test --pdb to directly enter into the failing test method.

  • Data loaded from fixtures and from migrations enabled with serialized_rollback=True are now available during TransactionTestCase.setUpClass().

URLLien vers cette rubrique

  • reverse() and reverse_lazy() now accept query and fragment keyword arguments, allowing the addition of a query string and/or fragment identifier in the generated URL, respectively.

UtilitairesLien vers cette rubrique

  • SafeString now returns NotImplemented in __add__ for non-string right-hand side values. This aligns with the str addition behavior and allows __radd__ to be used if available.

  • format_html_join() now supports taking an iterable of mappings, passing their contents as keyword arguments to format_html().

Backwards incompatible changes in 5.2Lien vers cette rubrique

API de moteur de base de donnéesLien vers cette rubrique

Cette section décrit des modifications qui pourraient être nécessaires dans des moteurs de base de données tiers.

  • The new Model._is_pk_set() method allows checking if a Model instance’s primary key is defined.

  • BaseDatabaseOperations.adapt_decimalfield_value() is now a no-op, simply returning the given value.

django.contrib.gisLien vers cette rubrique

  • Support for PostGIS 3.0 is removed.

  • Support for GDAL 3.0 is removed.

Dropped support for PostgreSQL 13Lien vers cette rubrique

Upstream support for PostgreSQL 13 ends in November 2025. Django 5.2 supports PostgreSQL 14 and higher.

Changed MySQL connection character set defaultLien vers cette rubrique

MySQL connections now default to using the utf8mb4 character set, instead of utf8, which is an alias for the deprecated character set utf8mb3. utf8mb3 can be specified in the OPTIONS part of the DATABASES setting, if needed for legacy databases.

DiversLien vers cette rubrique

Features deprecated in 5.2Lien vers cette rubrique

DiversLien vers cette rubrique

  • The all argument for the django.contrib.staticfiles.finders.find() function is deprecated in favor of the find_all argument.

  • Fallbacks to request.user and request.auser() when user is None in django.contrib.auth.login() and django.contrib.auth.alogin(), respectively, are deprecated.

  • The ordering keyword argument of the PostgreSQL specific aggregation functions django.contrib.postgres.aggregates.ArrayAgg, django.contrib.postgres.aggregates.JSONBAgg, and django.contrib.postgres.aggregates.StringAgg is deprecated in favor of the order_by argument.

  • Support for subclasses of RemoteUserMiddleware that override process_request() without overriding aprocess_request() is deprecated.