Notes de publication de Django 3.2¶
6 avril 2021
Bienvenue dans Django 3.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 3.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 3.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 2.2, se terminera en avril 2022.
Compatibilité Python¶
Django 3.2 requiert Python 3.6, 3.7, 3.8, 3.9 ou 3.10 (dès 3.2.9). Nous recommandons vivement et nous ne prenons officiellement en charge que la dernière publication de chaque série.
Quoi de neuf dans Django 3.2¶
Découverte automatique des classes AppConfig¶
La plupart des applications réutilisables définissent une sous-classe de AppConfig dans un sous-module apps.py. Elles définissent souvent une variable default_app_config pointant vers cette classe dans leur fichier __init__.py.
Lorsque le sous-module apps.py existe et définit une seule sous-classe AppConfig, Django utilise dorénavant automatiquement cette configuration, il est donc possible de supprimer default_app_config.
default_app_config rendait possible la déclaration simple du chemin d’application dans INSTALLED_APPS (par ex. 'django.contrib.admin') au lieu du chemin complet vers la classe de configuration (par ex. 'django.contrib.admin.apps.AdminConfig'). Cette variable avait été introduite par souci de rétrocompatibilité avec l’ancien style, dans l’intention de basculer l’écosystème dans la syntaxe plus longue, mais ceci ne s’est jamais produit.
Avec la découverte automatique des classes AppConfig, default_app_config n’a plus de raison d’être. Par conséquent, elle a été rendue obsolète.
Lisez Configuration des applications pour des informations plus complètes.
Personnalisation du type des clés primaires auto-générées¶
Lors de la définition d’un modèle, si aucun champ du modèle ne définit primary_key=True, une clé primaire implicite est créée. Le type de cette clé primaire implicite peut dorénavant être contrôlée par le réglage DEFAULT_AUTO_FIELD et l’attribut AppConfig.default_auto_field. Plus besoin de surcharger les clés primaires dans tous les modèles.
Afin de conserver le comportement historique, la valeur par défaut de DEFAULT_AUTO_FIELD est AutoField. À partir de la version 3.2, les nouveaux projets sont générés avec DEFAULT_AUTO_FIELD définie à BigAutoField. De même, les nouvelles applications sont générées avec AppConfig.default_auto_field définie à BigAutoField. Dans une future version de Django, la valeur par défaut de DEFAULT_AUTO_FIELD sera modifiée en BigAutoField.
Pour éviter des migrations non souhaitées dans le futur, définissez explicitement DEFAULT_AUTO_FIELD à AutoField:
DEFAULT_AUTO_FIELD = "django.db.models.AutoField"
ou configurez ce réglage par application:
from django.apps import AppConfig
class MyAppConfig(AppConfig):
default_auto_field = "django.db.models.AutoField"
name = "my_app"
ou même encore par modèle:
from django.db import models
class MyModel(models.Model):
id = models.AutoField(primary_key=True)
Par anticipation du changement de valeur par défaut, un contrôle système produit un avertissement si vous ne définissez pas explicitement DEFAULT_AUTO_FIELD dans votre projet.
When changing the value of DEFAULT_AUTO_FIELD, migrations for the
primary key of existing auto-created through tables cannot be generated
currently. See the DEFAULT_AUTO_FIELD docs for details on migrating
such tables.
Index fonctionnels¶
Le nouveau paramètre positionnel *expressions de Index() permet de créer des index fonctionnels sur la base d’expressions et de fonctions de base de données. Par exemple
from django.db import models
from django.db.models import F, Index, Value
from django.db.models.functions import Lower, Upper
class MyModel(models.Model):
first_name = models.CharField(max_length=255)
last_name = models.CharField(max_length=255)
height = models.IntegerField()
weight = models.IntegerField()
class Meta:
indexes = [
Index(
Lower("first_name"),
Upper("last_name").desc(),
name="first_last_name_idx",
),
Index(
F("height") / (F("weight") + Value(5)),
name="calc_idx",
),
]
Les index fonctionnels peuvent être ajoutés aux modèles en utilisant l’option Meta.indexes.
Prise en charge de pymemcache¶
The new django.core.cache.backends.memcached.PyMemcacheCache cache backend
allows using the pymemcache library for memcached. pymemcache 3.4.0
or higher is required. For more details, see the documentation on caching
in Django.
Nouveaux décorateurs pour le site d’administration¶
Le nouveau décorateur display() permet d’ajouter facilement des options à des fonctions d’affichage personnalisées pouvant être utilisée dans list_display ou readonly_fields.
De façon similaire, le nouveau décorateur action() permet d’ajouter facilement des options à des fonctions d’action pouvant être utilisée dans actions.
L’utilisation du décorateur @display a l’avantage de rendre possible la syntaxe de décoration @property lorsqu’il est nécessaire d’indiquer des attributs à une méthode personnalisée. Avant cela, il était nécessaire d’utiliser la fonction property() après la définition des attributs nécessaires à la méthode.
L’utilisation de décorateurs a l’avantage de rendre ces options plus accessibles car elles peuvent être suggérées par des utilitaires de complétion dans des éditeurs de code. Ces décorateurs sont de simples commodités et définissent en réalité les mêmes attributs sur les fonctions, sous le capot.
Fonctionnalités mineures¶
django.contrib.admin¶
ModelAdmin.search_fieldsautorise désormais la recherche de phrases contenant des espaces, entre guillemets.Les champs liés en lecture seule sont maintenant affichés comme des liens navigables si les modèles cibles sont inscrits dans le site d’administration.
Le site d’administration peut maintenant être thématisé, et il contient un thème sombre activé en fonction des réglages du navigateur. Voir Prise en charge des thèmes pour plus de détails.
ModelAdmin.autocomplete_fieldsrespecte dorénavant attr:ForeignKey.to_field <django.db.models.ForeignKey.to_field> etForeignKey.limit_choices_tolors de la recherche d’un modèle lié.Le site d’administration installe doérnavant une vue finale « attrape-tout » qui redirige les utilisateurs non authentifiés vers la page de connexion, que l’URL soit valide ou non. Ceci protège contre une potentielle faille de confidentialité par découverte de modèle.
Même si ce n’est pas recommandé, il est possible de définir le nouvel attribut
AdminSite.final_catch_all_viewàFalsepour désactiver cette vue « attrape-tout ».
django.contrib.auth¶
Le nombre d’itération par défaut du hacheur de mot de passe PBKDF2 a été augmenté de 216’000 à 260’000.
La variante par défaut du hacheur de mots de passe Argon2 a été changée en Argon2id.
memory_costetparallelismont été respectivement augmentées à 102’400 et 8 pour correspondre aux valeurs par défaut deargon2-cffi.L’augmentation de la valeur
memory_costfait augmenter la mémoire nécessaire de 512 Ko à 100 Mo. C’est toujours plutôt conservateur, mais peut amener à des problèmes de mémoire dans des environnements restreints. Dans ce genre de cas, il est possible de créer une sous-classe du hacheur existant pour surcharger les valeurs par défaut.L’entropie par défaut du sel des hacheurs de mots de passe Argon2, MD5, PBKDF2 et SHA-1 a été augmentée de 71 à 128 bits.
django.contrib.contenttypes¶
Le nouveau paramètre
absolute_maxdegeneric_inlineformset_factory()permet de personnaliser le nombre maximum de formulaires pouvant être instanciés lors de la soumission de donnéesPOST. Consultez Restriction du nombre maximum de formulaires instanciés pour plus de détails.Le nouveau paramètre
can_delete_extradegeneric_inlineformset_factory()permet de supprimer la possibilité de supprimer les formulaires supplémentaires. Voircan_delete_extrapour plus d’informations.
django.contrib.gis¶
La méthode
GDALRaster.transform()prend dorénavant en chargeSpatialReference.La classe
DataSourceprend dorénavant en chargepathlib.Path.La classe
LayerMappingprend dorénavant en chargepathlib.Path.
django.contrib.postgres¶
Le nouvel attribut
ExclusionConstraint.includepermet de créer des contraintes d’exclusion couvrantes avec PostgreSQL 12+.The new
ExclusionConstraint.opclassesattribute allows setting PostgreSQL operator classes.The new
JSONBAgg.orderingattribute determines the ordering of the aggregated elements.Le nouvel attribut
JSONBAgg.distinctdétermine si les valeurs agrégées seront distinctes.L’opération
CreateExtensioncontrôle dorénavant si l’extension existe déjà dans la base de données et saute la migration le cas échéant.Les nouvelles opérations
CreateCollationetRemoveCollationpermettent de créer et de supprimer des collations avec PostgreSQL. Voir Gestion des collations à l’aide des migrations pour plus de détails.Les requêtes sur les champs
ArrayFieldpermettent dorénavant des tableaux (non imbriqués) contenant des expressions dans les parties droites des requêtes.La nouvelle expression
OpClass()permet de créer des index fonctionnels sur les expressions avec une classe d’opérateur personnalisée. Voir Index fonctionnels pour plus de détails.
django.contrib.sitemaps¶
Les nouveaux attributs
alternates,languagesetx_defaultdeSitemappermettent de générer des versions (alternates) des plans de sites vers des versions traduites de vos pages.
Moteurs de base de données¶
Les moteurs de base de données de tierce partie peuvent maintenant sauter des tests ou les marquer comme échecs attendus dans la suite de tests de Django en utilisant les nouveaux attributs DatabaseFeatures.django_test_skips` et
django_test_expected_failures.
Décorateurs¶
Le nouveau décorateur
no_append_slash()permet à des vues individuelles d’être exclues de la normalisation des URL parAPPEND_SLASH.
Signalement d’erreurs¶
Les sous-classes personnalisées de
ExceptionReporterpeuvent maintenant définir les propriétéshtml_template_pathettext_template_pathpour surcharger les gabarits utilisés pour produire les rapports d’exceptions.
Téléversement de fichiers¶
La nouvelle fonction de rappel
FileUploadHandler.upload_interrupted()permet de traiter les téléversements interrompus.
Formulaires¶
Le nouveau paramètre
absolute_maxdeformset_factory(),inlineformset_factory()etmodelformset_factory()permet de personnaliser le nombre maximum de formulaires pouvant être instanciés lors de la soumission de donnéesPOST. Voir Restriction du nombre maximum de formulaires instanciés pour plus de détails.Le nouveau paramètre
can_delete_extradeformset_factory(),inlineformset_factory()etmodelformset_factory()permet d’enlever la possibilité de supprimer les formulaires supplémentaires. Voircan_delete_extrapour plus d’informations.Lorsqu’un formulaire de gestion est manquant ou a été manipulé,
BaseFormSetsignale dorénavant une erreur à l’utilisateur plutôt que de produire une exception. Pour personnaliser le message d’erreur, passez le paramètreerror_messagesavec la clé'missing_management_form'lors de l’instanciation du jeu de formulaires.
Vues génériques¶
Les attributs
week_formatde class:~django.views.generic.dates.WeekMixin etWeekArchiveViewprennent désormais en charge le format de semaine ISO 8601'%V'.
Commandes d’administration¶
loaddataprend désormais en charge les instantanés stockés dans des archives XZ (.xz) et LZMA (.lzma).dumpdatasait désormais comprimer les données dans les formatsbz2,gz,lzmaouxz.makemigrationspeut désormais être appelée sans connexion active de base de données. Dans ce cas, le contrôle de cohérence de l’historique des migrations est omis.BaseCommand.requires_system_checkspeut dorénavant accepter une liste d’étiquettes. Les contrôles système inscrits avec les étiquettes choisies seront appliqués avant d’exécuter la commande. Dans les versions précédentes, soit tous les contrôles systèmes étaient appliqués, soit aucun.La prise en charge des contenus de terminal colorés sous Windows a été mise à jour. Différents environnements de terminal modernes sont automatiquement détectés, et les options pour activer la prise en charge dans d’autre cas ont été améliorées. Voir Syntaxe colorée pour plus de détails.
Migrations¶
La nouvelle propriété
Operation.migration_name_fragmentpermet de fournir un fragment de nom de fichier qui sera utilisé pour nommer une migration contenant uniquement cette opération.Les migrations prennent désormais en charge la sérialisation des objets chemins purs et concrets des instances
pathlibetos.PathLike.
Modèles¶
The new
no_keyparameter forQuerySet.select_for_update(), supported on PostgreSQL, allows acquiring weaker locks that don’t block the creation of rows that reference locked rows through a foreign key.L’expression
When()autorise dorénavant l’utilisation du paramètreconditionaveclookups.Les nouveaux attributs
Index.includeetUniqueConstraint.includepermettent de créer des index couvrants et des contraintes de couverture uniques avec PostgreSQL 11+.Le nouvel attribut
UniqueConstraint.opclassespermet de définir des classes d’opérateur PostgreSQL.La méthode
QuerySet.update()respecte dorénavant la clauseorder_by()avec MySQL et MariaDB.FilteredRelation()prend désormais en charge les relations imbriquées.The
ofargument ofQuerySet.select_for_update()is now allowed on MySQL 8.0.1+.Value()expression now automatically resolves itsoutput_fieldto the appropriateFieldsubclass based on the type of its providedvalueforbool,bytes,float,int,str,datetime.date,datetime.datetime,datetime.time,datetime.timedelta,decimal.Decimal, anduuid.UUIDinstances. As a consequence, resolving anoutput_fieldfor database functions and combined expressions may now crash with mixed types when usingValue(). You will need to explicitly set theoutput_fieldin such cases.La nouvelle méthode
QuerySet.alias()permet de créer des alias réutilisables pour des expressions qui n’ont pas besoin d’être sélectionnées mais qui sont utiles pour le filtrage, le tri ou comme faisant partie d’expressions complexes.La nouvelle fonction
Collatepermet de filtrer et de trier en respectant les collations de base de données indiquées.The
field_nameargument ofQuerySet.in_bulk()now accepts distinct fields if there’s only one field specified inQuerySet.distinct().Le nouveau paramètre
tzinfodes fonctions de base de donnéesTruncDateetTruncTimepermettent de tronquer les dates/heures dans un fuseau horaire déterminé.Le nouveau paramètre
db_collationdeCharFieldet:attr:TextField <django.db.models.TextField.db_collation> permet de définir une collation de base de données pour le champ.La fonction de base de données
Randoma été ajoutée.Les Fonctions d’agrégation,
F(),OuterRef()et d’autres expressions autorisent désormais l’utilisation de transformations. Voir Les expressions peuvent référencer des transformations pour plus de détails.Le nouveau paramètre
durabledeatomic()garantit que les modifications effectuées dans le bloc atomique seront validées si le bloc se termine sans erreur. Un bloc atomique imbriqué marqué comme durable produira une exceptionRuntimeError.La fonction de base de données
JSONObjecta été ajoutée.
Pagination¶
La nouvelle méthode
django.core.paginator.Paginator.get_elided_page_range()permet de générer un intervalle de pages avec certaines valeurs éludées. Lorsqu’il y a beaucoup de pages, ceci peut s’avérer utile pour générer un nombre raisonnable de liens vers des pages dans un gabarit.
Requêtes et réponses¶
Les en-têtes de réponses sont désormais stockées dans
HttpResponse.headers. Ceci peut remplacer l’accès traditionnel par interface de style dictionnaire des objetsHttpResponse. Les deux interfaces continueront a être prises en charge. Voir Définition de champs d’en-tête pour plus de détails.Le nouveau paramètre
headersde class:~django.http.HttpResponse,SimpleTemplateResponseetTemplateResponsepermet de définir les en-têtes de réponseheaderslors de l’instanciation.
Sécurité¶
Le contenu du réglage
SECRET_KEYest dorénavant vérifié lors de son premier accès, plutôt qu’au moment du chargement des réglages. Ceci permet aux commandes d’administration qui ne dépendent pas deSECRET_KEYde s’exécuter sans qu’une valeur soit définie. Par suite de ce changement, l’appel àconfigure()sans fournir deSECRET_KEYvalable, puis poursuivre en accédant plus tard àsettings.SECRET_KEYproduira une exceptionImproperlyConfigured.Les nouvelles méthodes
Signer.sign_object()etSigner.unsign_object()permettent de signer des structures complexes. Voir Protection de structures de données complexes pour plus de détails.De plus,
signing.dumps()etloads()deviennent des raccourcis deTimestampSigner.sign_object()etunsign_object().
Sérialisation¶
Signaux¶
Signal.send_robust()journalise dorénavant les exceptions.
Gabarits¶
Le filtre de gabarit
floatformatpermet dorénavant d’utiliser le suffixegpour forcer le groupement parTHOUSAND_SEPARATORpour la locale active.Les gabarits mis en cache avec les chargeurs de gabarits en cache sont dorénavant rechargés correctement en mode développement.
Tests¶
Objects assigned to class attributes in
TestCase.setUpTestData()are now isolated for each test method. Such objects are now required to support creating deep copies withcopy.deepcopy(). Assigning objects which don’t supportdeepcopy()is deprecated and will be removed in Django 4.1.DiscoverRunnernow enablesfaulthandlerby default. This can be disabled by using thetest --no-faulthandleroption.DiscoverRunneret la commande d’administrationtestpeut dorénavant mesurer des temps d’exécution, y compris la mise en place de la base de données et le temps total d’exécution. Ceci peut être activé en utilisant l’optiontest --timing.Clientpréserve dorénavant la chaîne de requête lorsqu’il suit des redirections 307 et 308.La nouvelle méthode
TestCase.captureOnCommitCallbacks()capture dans une liste les fonctions de rappel transmises àtransaction.on_commit(). Cela permet de tester de telles fonctions de rappel sans devoir utiliser la classeTransactionTestCaseplus lente.TransactionTestCase.assertQuerysetEqual()now supports direct comparison against another queryset rather than being restricted to comparison against a list of string representations of objects when using the default value for thetransformargument.
Utilitaires¶
Le nouveau paramètre
depthdes fonctionsdjango.utils.timesince.timesince()etdjango.utils.timesince.timeuntil()permet d’indiquer le nombre d’unités de temps adjacentes à renvoyer.
Validateurs¶
Les validateurs intégrés incluent dorénavant la valeur fournie dans l’argument
paramsd’une erreurValidationError. Cela permet à des messages d’erreur personnalisés d’utiliser le substituant%(value)s.L’opérateur d’égalité de
ValidationErrorignore dorénavant l’ordre dansmessagesetparams.
Changements incompatibles avec les anciennes versions dans Django 3.2¶
API de moteur de base de données¶
Cette section décrit des modifications qui pourraient être nécessaires dans des moteurs de base de données tiers.
La nouvelle propriété
DatabaseFeatures.introspected_field_typesremplace ces capacités :can_introspect_autofieldcan_introspect_big_integer_fieldcan_introspect_binary_fieldcan_introspect_decimal_fieldcan_introspect_duration_fieldcan_introspect_ip_address_fieldcan_introspect_positive_integer_fieldcan_introspect_small_integer_fieldcan_introspect_time_fieldintrospected_big_auto_field_typeintrospected_small_auto_field_typeintrospected_boolean_field_type
Pour activer la prise en charge des index couvrants (
Index.include) et les contraintes de couverture uniques (UniqueConstraint.include), définissezDatabaseFeatures.supports_covering_indexesàTrue.Les moteurs de base de données externes doivent implémenter la prise en charge des collations de colonnes de base de données pour
CharFieldetTextFieldou définirDatabaseFeatures.supports_collation_on_charfieldetDatabaseFeatures.supports_collation_on_textfieldàFalse. Si les collations non déterministes ne sont pas prises en charge, définissezsupports_non_deterministic_collationsàFalse.DatabaseOperations.random_function_sql()a été supprimée en faveur de la nouvelle fonction de base de donnéesRandom.DatabaseOperations.date_trunc_sql()etDatabaseOperations.time_trunc_sql()acceptent dorénavant le paramètre facultatiftznameafin de tronquer dans un fuseau horaire bien précis.DatabaseClient.runshell()obtient dorénavant les arguments et un dictionnaire facultatif de variables d’environnement pour le client en ligne de commande sous-jacent à partir de la méthodeDatabaseClient.settings_to_cmd_args_env(). Les moteurs de bases de données tiers doivent implémenterDatabaseClient.settings_to_cmd_args_env()ou surchargerDatabaseClient.runshell().Les moteurs de bases de données tiers doivent implémenter la prise en charge des index fonctionnels (
Index.expressions) ou définirDatabaseFeatures.supports_expression_indexesàFalse. SiCOLLATEne fait pas partie de l’instructionCREATE INDEX, définissezDatabaseFeatures.collate_as_index_expressionàTrue.
django.contrib.admin¶
Les liens de pagination dans le site d’administration sont dorénavant indicées à partir de 1 au lieu de 0, c’est-à-dire que la chaîne de requête de la première page est
?p=1au lieu de?p=0.La nouvelle vue « attrape-tout » du site d’administration casse les motifs d’URL routés après les URL d’administration et dont le préfixe correspond à celui de l’administration. Vous pouvez alors soit ajuster l’ordre de vos URL ou si nécessaire définir
AdminSite.final_catch_all_viewàFalse, désactivant ainsi la vue « attrape-tout ». Voir Quoi de neuf dans Django 3.2 pour plus de détails.Les fichiers JavaScript minifiés ne sont plus inclus avec le site d’administration. Si vous devez avoir accès à ces fichiers minifiés, considérez l’utilisation d’une application tierce ou d’un outil de construction externe. Il reste cependant dans le site d’administration la version minifiée des bibliothèques JavaScript externes (par ex. jquery.min.js).
ModelAdmin.prepopulated_fieldsn’exclut plus les mots vides anglais tels que'a'ou'an'.
django.contrib.gis¶
La prise en charge de PostGIS 2.2 a été supprimée.
Le moteur Oracle clone dorénavant les polygones (et les collections géométriques contenant des polygones) avant de les réorienter et de les enregistrer en base de données. Ils ne sont plus modifiés eux-mêmes. Cela peut se remarquer quand on utilise des polygones après l’enregistrement d’un modèle.
Abandon de la prise en charge de PostgreSQL 9.5¶
La prise en charge amont de PostgreSQL 9.5 se termine en février 2021. Django 3.2 prend en charge PostgreSQL 9.6 et plus récent.
Abandon de la prise en charge de MySQL 5.6¶
La fin de la prise en charge amont de MySQL 5.6 est en avril 2021. Django 3.2 prend en charge MySQL 5.7 et plus récent.
Divers¶
Django prend dorénavant en charge les fuseaux horaires non-
pytz, tels que ceux du modulezoneinfode Python 3.9+ et ses rétroportages.La méthode non documentée
SpatiaLiteOperations.proj4_version()a été renommée enproj_version().slugify()supprime dorénavant les tirets et soulignements en début et fin de texte.The
intcommaandintwordtemplate filters no longer depend on theUSE_L10Nsetting.La prise en charge de
argon2-cffi< 19.1.0 a été abandonnée.Les clés de cache ne contiennent plus la langue lorsque l’internationalisation est désactivée (
USE_I18N = False) et que la régionalisation est activée (USE_L10N = True). Après la mise à jour vers Django 3.2 dans une configuration telle que celle-ci, la première requête vers une valeur précédemment en cache produira un défaut de cache.ForeignKey.validate()utilise dorénavant_base_managerau lieu de_default_managerpour vérifier si des instances liées existent.Lorsqu’une application définit une sous-classe de
AppConfigdans un sous-moduleapps.py, Django utilise désormais automatiquement cette configuration, même si elle n’est pas activée avecdefault_app_config. Définisezdefault = Falsedans la sous-classe deAppConfigsi vous voulez empêcher ce comportement. Voir Quoi de neuf dans Django 3.2 pour plus de détails.L’instanciation d’un modèle abstrait produit dorénavant une erreur
TypeError.Les arguments nommés de
setup_databases()sont dorénavant exclusivement des arguments nommés.La fonction non documentée
django.utils.http.limited_parse_qsl()a été supprimée. Utilisezurllib.parse.parse_qsl()à la place.django.test.utils.TestContextDecoratornow usesaddCleanup()so that cleanups registered in thesetUp()method are called beforeTestContextDecorator.disable().SessionMiddlewareproduit dorénavant l’exception exc:~django.contrib.sessions.exceptions.SessionInterrupted au lieu deSuspiciousOperationlorsqu’une session est détruite dans une requête concurrente.L’opérateur d’égalité de
django.db.models.Fielddistingue dorénavant correctement les instances de champ héritées entre modèles. De plus, l’ordre de tels champs est dorénavant défini.La fonction non documentée
django.core.files.locks.lock()renvoie dorénavantFalsesi le fichier ne peut être verrouillé, au lieu de produire l’exceptionBlockingIOError.Le mécanisme de réinitialisation de mot de passe invalide dorénavant les jetons lorsque l’adresse de courriel d’un utilisateur change.
La commande
makemessagesne traite plus les locales non valables indiquées par l’optionmakemessages --locale, notamment lorsqu’elles contiennent des tirets ('-').Le champ de formulaire
django.contrib.auth.forms.ReadOnlyPasswordHashFieldest dorénavant désactivé par défaut. Par conséquent,UserChangeForm.clean_password()n’est plus nécessaire pour renvoyer la valeur initiale.Les opérations de cache
cache.get_many(),get_or_set(),has_key(),incr(),decr(),incr_version()etdecr_version()gèrent maintenant correctement les valeursNonestockées dans le cache, comme pour toute autre valeur, au lieu de faire comme si la clé n’existait pas dans le cache.En raison d’une limitation de
python-memcached, le comportement précédent a été conservé pour le moteur obsolèteMemcachedCache.La version minimum de SQLite prise en charge est passée de 3.8.3 à 3.9.0.
CookieStoragestocke dorénavant ses messages dans le format compatible RFC 6265. La prise en charge des cookies utilisant l’ancien format est conservée jusqu’à Django 4.1.La version minimum de
asgirefprise en charge est passée de 3.2.10 à 3.3.2.
Fonctionnalités rendues obsolètes dans Django 3.2¶
Divers¶
Assigning objects which don’t support creating deep copies with
copy.deepcopy()to class attributes inTestCase.setUpTestData()is deprecated.L’utilisation d’une valeur booléenne dans attr:.BaseCommand.requires_system_checks est osbolète. Utilisez
'__all__'au lieu deTrue, et[](une liste vide) au lieu deFalse.L’argument
whitelistet l’attributdomain_whitelistdeEmailValidatorsont obsolètes. Utilisezallowlistau lieu dewhitelistetdomain_allowlistau lieu dedomain_whitelist. Il se peut que vous deviez renommerwhitelistdans des migrations existantes.La variable de configuration d’application
default_app_configest osbolète, en raison de l’ajout de la découverte automatique des classesAppConfig. Consultez Quoi de neuf dans Django 3.2 pour plus de détails.L’appel automatique à
repr()sur un jeu de requête dansTransactionTestCase.assertQuerysetEqual()lors de la comparaison avec des chaînes est obsolète. SI vous avez besoin du comportement précédent, définissez explicitementtransformàrepr.Le moteur
django.core.cache.backends.memcached.MemcachedCacheest obsolète carpython-memcachedprésente quelques problèmes et ne semble actuellement plus maintenu. Utilisez plutôtdjango.core.cache.backends.memcached.PyMemcacheCacheoudjango.core.cache.backends.memcached.PyLibMCCache.Le format des messages utilisé par
django.contrib.messages.storage.cookie.CookieStorageest différent du format généré par les anciennes versions de Django. La prise en charge de l’ancien format demeure jusqu’à Django 4.1.