L’infrastructure de contrôle système est un ensemble de contrôles statiques pour valider les projets Django. Elle détecte les problèmes courants et fournit des conseils sur la façon de les corriger. L’infrastructure est extensible de sorte que vous pouvez facilement ajouter vos propres contrôles.
Pour plus de détails sur la façon d’ajouter vos propres contrôles et les intégrer aux contrôles systèmes de Django, consultez le Guide thématique sur la vérification système.
CheckMessage¶CheckMessage(level, msg, hint=None, obj=None, id=None)¶Les avertissements et les erreurs signalés par les contrôles systèmes doivent être des instances de CheckMessage. Une instance encapsule une seule erreur à signaler ou un seul avertissement. Elle fournit également des indicateurs et le contexte applicables au message, et un identifiant unique qui est utilisé à des fins de filtrage.
Les arguments du constructeur sont :
levelDEBUG, INFO, WARNING, ERROR, CRITICAL. Si le niveau est supérieur ou égal à ERROR, Django empêchera l’exécution des commandes de gestion. Les messages avec un niveau inférieur à ERROR (i.e. les avertissements) sont présentés dans la console, mais peuvent être réduits au silence.msghintNone peut être utilisée.obj__str__(). La méthode est utilisée lors de la collecte de tous les messages et son résultat précède le message.idapplabel.X001, où X est l’une des lettres CEWID, indiquant la gravité du message (C pour critique, E pour les erreurs et ainsi de suite). Le numéro peut être attribué par l’application, mais doit être unique au sein de cette application.Il existe des sous-classes pour faciliter la création des messages avec les niveaux de base. Lorsque vous les utilisez, vous pouvez omettre le paramètre level car il est sous-entendu par le nom de la classe.
Debug(msg, hint=None, obj=None, id=None)¶Info(msg, hint=None, obj=None, id=None)¶Warning(msg, hint=None obj=None, id=None)¶Error(msg, hint=None, obj=None, id=None)¶Critical(msg, hint=None, obj=None, id=None)¶Les contrôles systèmes de Django sont organisés en utilisant les étiquettes suivantes :
admin: contrôles de toutes les déclarations de sites d’administration.async_support: contrôle la configuration liée au code asynchrone.caches: contrôle la configuration liée aux caches (mémoire tampon).compatibility: identification de problèmes potentiels avec les mises à jour.database: vérifie des problèmes de configuration liés aux bases de données. Les contrôles de base de données ne sont pas exécutés par défaut car ils font plus que de l’analyse de code statique comme le font les autres contrôles. Ils ne sont lancés que par la commande migrate ou si vous indiquez des alias de base de données configurés avec l’option database lors de l’appel à la commande check.files: contrôle la configuration liée aux fichiers.models: contrôles régissant les définitions de modèles, champs et gestionnaires.security: contrôle la configuration liée à la sécurité.signals: contrôles des déclarations de signaux et des enregistrements de gestionnaires.sites: contrôle la configuration de django.contrib.sites.staticfiles: contrôle la configuration liée à django.contrib.staticfiles.templates: contrôle la configuration liée aux gabarits.translation: vérifie la configuration liée aux traductions.urls: contrôle la configuration des URL.Certains contrôles peuvent être enregistrés sous plusieurs étiquettes.
Les contrôles suivants vérifient votre configuration concernant Gestion du code asynchrone:
Les contrôles de compatibilité alertent sur des problèmes potentiels pouvant se produire après une mise à jour de Django.
<pattern> possède une route contenant (?P<, commençant par ^ ou se terminant par $. Il s’agit probablement d’un oubli lors du passage de url() à path().CSRF_TRUSTED_ORIGINS doivent commencer par un protocole (généralement http://` ou https://), mais <nom_hôte> a été trouvé.Les contrôles suivants vérifient que le réglage CACHES est configuré correctement :
'default' dans votre réglage CACHES.<cache> peut exposer votre cache ou permettre une corruption de vos données car son emplacement LOCATION correspond à, ou se trouve dans un des réglages MEDIA_ROOT/STATIC_ROOT/STATICFILES_DIRS.LOCATION du <cache> est relatif. Utilisez plutôt un chemin absolu.Si vous utilisez MySQL ou MariaDB, les contrôles suivants seront effectués :
CharField uniques d’avoir un attribut max_length > 255. Ce contrôle a été transformé en mysql.W003 dans Django 3.1 car la taille maximale réelle dépend de plusieurs facteurs.<alias>. Voir aussi Définition de sql_mode.CharField uniques d’avoir un attribut max_length > 255.Les contrôles suivants vérifient votre configuration concernant Gestion des fichiers:
FILE_UPLOAD_TEMP_DIR se réfère au répertoire inexistant <path>."__".pk est un mot réservé et ne peut pas être utilisé comme nom de champ.choices doit être une table de correspondance (par ex. un dictionnaire) ou un élément itérable (par ex. une liste ou un tuple).choices doit être une table faisant correspondre des valeurs réelles à des noms humainement lisibles ou un élément itérable contenant des tuples (valeur réelle, nom convivial).db_index ne peut contenir que None, True ou False.null=True.validators doivent être exécutables.max_length est trop court pour accueillir la plus longue valeur de choices (<count> caractères).<champ> doit être un objet exécutable plutôt qu’une instance afin qu’elle ne soit pas partagée entre toutes les instances de ce champ.<base_de_données> ne prend pas en charge les valeurs par défaut en base de données contenant des expressions (db_default).<expression> ne peut pas être utilisée dans db_default.AutoField doivent déclarer primary_key=True.BooleanField n’acceptent pas les valeurs nulles. Ce contrôle est apparu avant la prise en charge des valeurs nulles ajoutée dans Django 2.1.CharField doivent définir un attribut max_length.max_length doit être un entier positif.max_length est ignoré lorsqu’il est utilisé pour un champ <type de champ entier>.DecimalField doivent définir un attribut decimal_places.decimal_places doit être un entier non négatif.DecimalField doivent définir un attribut max_digits.max_digits doit être un entier positif.max_digits doit être supérieur ou égal à decimal_places.FilePathField doivent comporter l’un des deux attributs allow_files et allow_folders défini à True.GenericIPAddressField ne peuvent avoir blank=True si null=False, car les valeurs vides sont stockées sous forme de valeurs nulles.auto_now, auto_now_add et default sont mutuellement exclusives. Une seule de ces options doit être conservée.<base_de_données> ne prend pas en charge les index sur les colonnes <type données champ>.<base_de_données> ne gère pas les commentaires sur les colonnes (db_comment).BinaryField ne peut pas être une chaîne. Utilisez plutôt un contenu binaire.<base de données> ne prend pas en charge les champs JSONField.<base_de_données> ne prend pas en charge les collations sur les colonnes <field_type>.<base de données> ne prend pas en charge les champs GeneratedField.<base de données> ne prend pas en charge les champs GeneratedField non persistants.<base de données> ne prend pas en charge les champs GeneratedField persistants.GeneratedField.output_field contient des erreurs : …GeneratedField.output_field contient des avertissements : …IPAddressField a été supprimé, sauf pour la prise en charge de migrations historiques.IPAddressField est obsolète. Sa prise en charge (à l’exception des migrations historiques) sera supprimée dans Django 1.9. Ce contrôle apparaît dans Django 1.7 et 1.8.CommaSeparatedIntegerField est obsolète. Sa prise en charge (à l’exception des migrations historiques) sera supprimée dans Django 2.0. Ce contrôle apparaît avec Django 1.10 et 1.11.CommaSeparatedIntegerField a été supprimé, sauf pour la prise en charge de migrations historiques.FloatRangeField est obsolète et sera supprimé dans Django 3.1. Ce contrôle est apparu dans Django 2.2 et 3.0.NullBooleanField est obsolète. Sa prise en charge (à l’exception des migrations historiques) sera supprimée dans Django 4.0. Ce contrôle apparaît dans Django 3.1 et 3.2.NullBooleanField a été supprimé, sauf pour la prise en charge de migrations historiques.django.contrib.postgres.fields.JSONField est obsolète. Sa prise en charge (à l’exception des migrations historiques) sera supprimée dans Django 4.0. Ce contrôle apparaît dans Django 3.1 et 3.2.django.contrib.postgres.fields.JSONField a été supprimé, sauf pour la prise en charge de migrations historiques.django.contrib.postgres.fields.CICharField est osbolète. Sa prise en charge (sauf pour les migrations historiques) sera supprimée dans Django 5.1.django.contrib.postgres.fields.CIEmailField est obsolète. Sa prise en charge (à l’exception des migrations historiques) sera supprimée dans Django 5.1.django.contrib.postgres.fields.CITextField est obsolète. Sa prise en charge (à l’exception des migrations historiques) sera supprimée dans Django 5.1.unique n’est pas un paramètre valable pour un champ FileField. Ce contrôle est supprimé dans Django 1.11.primary_key n’est pas un paramètre valable pour un champ FileField.upload_to de FileField doit être un chemin relatif, et non absolu.ImageField car Pillow n’est pas installé.<swappable> n’est pas sous la forme étiquette_app.nom_app.<RÉGLAGE> fait référence à <modèle>, qui n’est pas installé ou qui est abstrait.<étiquette_app>.<modèle>.id ne peut être utilisé comme nom de champ que si le champ définit aussi primary_key=True.<nom_de_champ> du modèle parent <modèle> entre en conflit avec le champ <nom_de_champ> du modèle parent <modèle>.<nom_de_champ> entre en conflit avec le champ <nom_de_champ> du modèle <modèle>.<nom_de_champ> a le nom de colonne <nom_de_colonne> qui est utilisé par un autre champ.index_together doit être une liste ou un tuple.index_together doivent être des listes ou des tuples.unique_together doit être une liste ou un tuple.unique_together doivent être des listes ou des tuples.contrainte/index/index_together/unique_together fait référence au champ inexistant <nom_de_champ>.contrainte/index/index_together/unique_together fait référence à un <nom_de_champ> de type ManyToManyField, mais ces champs ne sont pas pris en charge pour cette option.ordering doit être un tuple ou une liste (même si vous souhaitez trier sur un seul champ).ordering fait référence au champ, champ lié ou recherche inexistant <nom_de_champ>.contrainte/index/index_together/unique_together se réfèrent au champ <nom_de_champ> qui n’est pas local au modèle <modèle>.<modèle> contient des champs de modèle.<champ>. La longueur maximale est de <longueur_maximum> pour la base de données <alias>.<champ>. La longueur maximale est de <longueur_maximum> pour la base de données <alias>.<modèle>.check() est actuellement surchargée.ordering et order_with_respect_to ne peuvent pas être utilisés simultanément.<fonction> contient une référence différée à <étiquette_app>.<modèle>, mais l’application <étiquette_app> n’est pas installée ou ne fournit pas de modèle <modèle>.<modèle> ne peut pas commencer ni se terminer par un soulignement car cela entre en conflit avec la syntaxe de requête.<modèle> ne peut pas contenir de double soulignement car cela entre en conflit avec la syntaxe de requête.<nom_de_propriété> entre en conflit avec un accesseur de champ lié.primary_key=True.<base de données> ne prend pas en charge les contraintes de vérification.db_table <table_bd> est utilisée par plusieurs modèles : <liste de modèles>.<index> n’est pas unique pour le modèle <modèle>.<index> n’est pas unique parmi les modèles : <liste_modèles>.<contrainte> n’est pas unique pour le modèle <modèle>.<contrainte> n’est pas unique parmi les modèles <liste_modèles>.<index> ne peut pas commencer par un soulignement, ni par un nombre.<index> ne peut pas dépasser <max_length> caractères.db_table <table_bd> est utilisée par plusieurs modèles : <liste de modèles>.<base de données> ne prend pas en charge les contraintes d’unicité avec conditions.<base de données> ne prend pas en charge les index avec conditions.<base de données> ne prend pas en charge les contraintes d’unicité différables.<base de données> ne prend pas en charge les contraintes d’unicité avec des colonnes qui ne sont pas des clés.<base de données> ne prend pas en charge les index avec des colonnes qui ne sont pas des clés.constraints fait référence au champ joint <nom_de_champ>.django.db.models.AutoField.<base de données> ne prend pas en charge les index sur les expressions.<base de données> ne prend pas en charge les contraintes d’unicité avec les expressions.<contrainte> contient une expression RawSQL() et ne sera pas validée dans la méthode full_clean() du modèle.<database> ne prend pas en charge les commentaires sur les tables (db_table_comment).<base de données> ne prend pas en charge les contraintes d’unicité avec nuls distincts.Les contrôles de sécurité ne rendent pas votre site sûr. Ils n’auditent pas votre code, ne font pas de détection d’intrusion ou quoi que ce soit d’autre de particulièrement complexe. Ils s’occupent plutôt d’une liste de contrôles automatisés détectant les problèmes les plus évidents qui peuvent vous aider à améliorer la sécurité d’un site.
Certains de ces contrôles ne sont pas forcément adéquats pour votre configuration de déploiement particulière. Par exemple, si vous avez délégué la redirection HTTP vers HTTPS à un répartiteur de charge, il serait gênant d’être constamment averti que le réglage SECURE_SSL_REDIRECT n’est pas actif. Utilisez SILENCED_SYSTEM_CHECKS pour réduire au silence les contrôles non nécessaires.
Les contrôles suivants sont exécutés si l’option check --deploy est indiquée :
django.middleware.security.SecurityMiddleware ne figure pas dans MIDDLEWARE ce qui rendra ineffectif les réglages SECURE_HSTS_SECONDS, SECURE_CONTENT_TYPE_NOSNIFF, SECURE_REFERRER_POLICY, SECURE_CROSS_ORIGIN_OPENER_POLICY et SECURE_SSL_REDIRECT.django.middleware.clickjacking.XFrameOptionsMiddleware ne figure pas dans MIDDLEWARE, ce qui fait que vos pages ne seront pas servies avec un en-tête 'x-frame-options'. Sauf dans les cas où il existe une bonne raison pour que votre site apparaisse dans un cadre, il est recommandé d’activer cet en-tête pour contribuer à prévenir les attaques par détournement de clic.django.middleware.csrf.CsrfViewMiddleware ne figure pas dans MIDDLEWARE). L’activation de l’intergiciel est l’approche la plus sûre pour s’assurer qu’aucun trou ne subsiste dans cette protection.SECURE_HSTS_SECONDS. Si tout votre site est entièrement servi par SSL, il est possible d’envisager définir une valeur et d’activer HSTS (HTTP Strict Transport Security). Mais prenez soin de lire premièrement la documentation ; l’activation précipitée de HSTS peut être la cause de problèmes sérieux et irréversibles.SECURE_HSTS_INCLUDE_SUBDOMAINS à True. Sans cela, votre site est potentiellement vulnérable à des attaques via une connexion non sécurisée à un sous-domaine. Ne choisissez la valeur True que si vous êtes sûr que tous les sous-domaines de votre domaine sont exclusivement servis par SSL.SECURE_CONTENT_TYPE_NOSNIFF n’est pas défini à True, ce qui fait que vos pages ne seront pas servies avec un en-tête 'X-Content-Type-Options: nosniff'. Vous devriez envisager d’activer cet en-tête pour empêcher les navigateurs d’identifier de manière incorrecte les types de contenu.SECURE_BROWSER_XSS_FILTER n’est pas défini à True, ce qui fait que vos pages ne seront pas servies avec un en-tête 'X-XSS-protection: 1; mode=block'. Vous devriez envisager d’activer cet en-tête pour activer le filtrage XSS des navigateurs et aider ainsi à prévenir les attaques XSS. Ce contrôle a été supprimé dans Django 3.0 car l’en-tête X-XSS-Protection n’est plus pris en compte par les navigateurs modernes.SECURE_SSL_REDIRECT n’est pas défini à True. Sauf si votre site doit être accessible à la fois par des connexions SSL et non SSL, il est conseillé de soit définir ce réglage à True, soit de configurer un répartiteur de charge ou un serveur mandataire inverse pour rediriger toutes les connexions vers HTTPS.SECRET_KEY contient moins de 50 caractères, moins de 5 caractères différents ou est préfixée par 'django-insecure-', ce qui indique qu’elle a été générée automatiquement par Django. Veuillez générer une valeur longue et aléatoire, faute de quoi de nombreuses fonctionnalités de Django liées à la sécurité seront vulnérables aux attaques.django.contrib.sessions se trouve dans votre réglage INSTALLED_APPS mais vous n’avez pas défini SESSION_COOKIE_SECURE à True. L’utilisation d’un cookie de session sécurisé complique la tâche des renifleurs de trafic réseau quand ils essaient de s’immiscer dans les sessions des utilisateurs.django.contrib.sessions.middleware.SessionMiddleware figure dans MIDDLEWARE, mais vous n’avez pas défini SESSION_COOKIE_SECURE à True. L’utilisation d’un cookie de session sécurisé complique la tâche des renifleurs de trafic réseau quand ils essaient de s’immiscer dans les sessions des utilisateurs.SESSION_COOKIE_SECURE n’est pas défini à True. L’utilisation d’un cookie de session sécurisé complique la tâche des renifleurs de trafic réseau quand ils essaient de s’immiscer dans les sessions des utilisateurs.django.contrib.sessions se trouve dans votre réglage INSTALLED_APPS mais vous n’avez pas défini SESSION_COOKIE_HTTPONLY à True. L’utilisation d’un cookie de session HttpOnly complique la tâche des attaques par script inter-site quand elles essaient de s’immiscer dans les sessions des utilisateurs.django.contrib.sessions.middleware.SessionMiddleware figure dans MIDDLEWARE, mais vous n’avez pas défini SESSION_COOKIE_HTTPONLY à True. L’utilisation d’un cookie de session HttpOnly complique la tâche des attaques par script inter-site quand elles essaient de s’immiscer dans les sessions des utilisateurs.SESSION_COOKIE_HTTPONLY n’est pas défini à True. L’utilisation d’un cookie de session HttpOnly complique la tâche des attaques par script inter-site quand elles essaient de s’immiscer dans les sessions des utilisateurs.CSRF_COOKIE_SECURE n’est pas défini à True. L’utilisation d’un cookie CSRF sécurisé complique la tâche des renifleurs de trafic réseau quand ils essaient de voler le jeton CSRF.CSRF_COOKIE_HTTPONLY n’est pas défini à True. L’utilisation d’un cookie CSRF HttpOnly complique la tâche des attaques par script inter-site quand elles essaient de voler le jeton CSRF. Ce contrôle est supprimé dans Django 1.11 car le réglage CSRF_COOKIE_HTTPONLY n’offre aucun bénéfice concret.DEBUG ne devrait pas être défini à True pour une application Django déployée.django.middleware.clickjacking.XFrameOptionsMiddleware figure dans MIDDLEWARE, mais X_FRAME_OPTIONS n’est pas défini à 'DENY'. Sauf dans les cas où un site a une bonne raison de servir certaines de ses parties dans un cadre, vous devriez modifier ce réglage à 'DENY'.ALLOWED_HOSTS ne peut pas être vide en déploiement.SECURE_HSTS_PRELOAD à True. Sans cela, votre site ne peut pas être proposé à la liste de préchargement des navigateurs.SECURE_REFERRER_POLICY. Sans cela, votre site n’enverra pas d’en-tête Referrer-Policy. Vous devriez envisager d’activer cet en-tête pour protéger la confidentialité des utilisateurs.SECURE_REFERRER_POLICY n’est pas valable.SECURE_CROSS_ORIGIN_OPENER_POLICY n’est pas valable.SECRET_KEY_FALLBACKS[n] contient moins de 50 caractères, moins de 5 caractères différents ou est préfixée par 'django-insecure-', ce qui indique qu’elle a été générée automatiquement par Django. Veuillez générer une valeur longue et aléatoire, faute de quoi de nombreuses fonctionnalités de Django liées à la sécurité seront vulnérables aux attaques.Les contrôles suivants vérifient que les réglages liés à la sécurité sont correctement configurés :
DEFAULT_HASHING_ALGORITHM doit contenir 'sha1' ou 'sha256'. Ce contrôle est apparu dans Django 3.1 et 3.2.chemin.vers.vue n’accepte pas le bon nombre d’arguments.chemin.vers.vue n’a pas pu être importée.<gestionnaire> est connecté au signal <signal> avec une référence différée vers l’expéditeur <étiquette app>.<modèle>, mais <étiquette app> n’est pas installé ou ne fournit pas le modèle <modèle>.Les contrôles suivants vérifient que le réglage TEMPLATES est configuré correctement :
'APP_DIRS': True figure dans votre réglage TEMPLATES mais 'loaders' est aussi dans OPTIONS. Supprimez APP_DIRS ou l’option 'loaders'.string_if_invalid dans TEMPLATES OPTIONS doit être une chaîne, mais c’est actuellement : {valeur} ({type}).<name> est utilisé pour plusieurs modules de balises de gabarits: <module list>. Ce contrôle a été modifié en templates.W003 dans Django 4.1.2.<name> est utilisé pour plusieurs modules de balises de gabarits : <module list>.Les contrôles suivants sont effectués sur votre configuration de traduction :
LANGUAGE_CODE contient une valeur non valide : <valeur>.LANGUAGES n’est pas valable : <valeur>.LANGUAGES_BIDI n’est pas valable : <valeur>.LANGUAGE_CODE n’est pas présente dans le réglage LANGUAGES.Les contrôles suivants sont effectués sur votre configuration d’URL :
<pattern> utilise include() avec une expression route se terminant par $. Enlevez le dollar de l’expression route pour éviter des problèmes lors de l’inclusion d’URL.<pattern> possède une expression route commençant par /. Enlevez cette barre oblique car elle n’est pas nécessaire. Si ce motif est référencé par un include(), vérifiez que le motif include() se termine par /.<pattern> possède un nom name contenant un :. Enlevez ces deux-points pour éviter des références d’espaces de noms ambigus.<motif> n’est pas valide. Vérifiez que urlpatterns est bien une liste d’instances path() ou re_path().<espace de nom> n’est pas unique. Il est possible que certains URL de cet espace de noms ne puissent pas être résolus.MEDIA_URL/ STATIC_URL doivent se terminer par une barre oblique.handlerXXX personnalisée 'chemin.vers.vue' ne prend pas le nombre correct de paramètres (…).handlerXXX personnalisée 'chemin.vers.vue' n’a pas pu être importée.<motif> possède un vue non valable, passez <vue>.as_view() au lieu de <vue>.<motif> possède un <chevron> non symétrique.contrib¶admin¶Les contrôles de l’interface d’administration sont tous effectués sous l’étiquette admin.
Les contrôles suivants sont effectués sur toute classe (ou sous-classe de) ModelAdmin qui est inscrite auprès du site d’administration :
raw_id_fields doit être une liste ou un tuple.raw_id_fields[n] fait référence à <nom_de_champ>, qui n’est pas un champ de <modèle>.raw_id_fields[n] doit être une clé étrangère ou un champ plusieurs-à-plusieurs.fields doit être une liste ou un tuple.fieldsets et fields sont tous deux spécifiés.fields contient des champs en double.fieldsets doit être une liste ou un tuple.fieldsets[n] doit être une liste ou un tuple.fieldsets[n] doit être de longueur 2.fieldsets[n][1] doit être un dictionnaire.fieldsets[n][1] doit contenir la clé fields.fieldsets[n][1].fields[n]/filter_horizontal[n]/filter_vertical[n]/fieldsets[n][m] ne peut pas inclure le champ ManyToManyField <nom_de_champ>, car ce champ définit manuellement un modèle de relation.exclude doit être une liste ou un tuple.exclude contient des champs en double.form doit hériter de BaseModelForm.filter_vertical doit être une liste ou un tuple.filter_horizontal doit être une liste ou un tuple.filter_vertical[n]/filter_horizontall[n] fait référence à <nom_de_champ>, qui n’est pas un champ de <modèle>.filter_vertical[n]/filter_horizontal[n] doit être un champ plusieurs-à-plusieurs.radio_fields doit être un dictionnaire.radio_fields fait référence à <nom_de_champ>, qui n’est pas un champ de <modèle>.radio_fields fait référence à <nom_de_champ>, qui n’est pas une instance de clé ForeignKey et n’a pas de définition choices.radio_fields[<nom_de_champ>] doit être soit admin.HORIZONTAL soit admin.VERTICAL.view_on_site doit être soit un objet exécutable, soit une valeur booléenne.prepopulated_fields doit être un dictionnaire.prepopulated_fields fait référence à <nom_de_champ>, qui n’est pas un champ de <modèle>.prepopulated_fields fait référence à <nom_de_champ>, qui ne doit pas être un champ DateTimeField, ForeignKey, OneToOneField ni ManyToManyField.prepopulated_fields[<nom_de_champ>] doit être une liste ou un tuple.prepopulated_fields fait référence à <nom_de_champ>, qui n’est pas un champ de <modèle>.ordering doit être une liste ou un tuple.ordering a le marqueur d’ordre aléatoire ?, mais contient aussi d’autres champs.ordering fait référence à <nom_de_champ>, qui n’est pas un champ de <modèle>.readonly_fields doit être une liste ou un tuple.readonly_fields[n] fait référence à <nom_de_champ>, qui n’est pas un objet exécutable, un attribut de <classe ModelAdmin>, ni un attribut de <modèle>.autocomplete_fields doit être une liste ou un tuple.autocomplete_fields[n] fait référence à <nom_de_champ>, qui n’est pas un champ de <modèle>.autocomplete_fields[n] doit être une clé étrangère ou un champ plusieurs-à-plusieurs.<modèle> doit être inscrite pour être référencée par <modeladmin>.autocomplete_fields.<modeladmin> doit définir search_fields car il est référencé par <autre_modeladmin>.autocomplete_fields .ModelAdmin¶Les contrôles suivants sont effectués sur toute classes (ou sous-classe de) ModelAdmin qui est enregistrée auprès du site d’administration:
save_as doit être un booléen.save_on_top doit être un booléen.inlines doit être une liste ou un tuple.<InlineModelAdmin class> doit hériter de InlineModelAdmin.<InlineModelAdmin class> doit avoir un attribut model.<InlineModelAdmin class>.model doit être un Model.list_display doit être une liste ou un tuple.list_display[n] fait référence à <label>, qui n’est pas un objet exécutable, un attribut de <classe ModelAdmin>, ni un attribut ou une méthode de <modèle>.list_display[n] ne peut pas être un champ plusieurs-à-plusieurs ni une clé étrangère inverse.list_display_links doit être une liste, un tuple ou None.list_display_links[n] fait référence à <label>, qui n’est pas défini dans list_display.list_filter doit être une liste ou un tuple.list_filter[n] doit hériter de ListFilter.list_filter[n] ne doit pas hériter de FieldListFilter.list_filter[n][1] doit hériter de FieldListFilter.list_filter[n] fait référence à <label>, qui ne fait pas référence à un champ Field.list_select_related doit être une valeur booléenne, un tuple ou une liste.list_per_page doit être un nombre entier.list_max_show_all doit être un nombre entier.list_editable doit être une liste ou un tuple.list_editable[n] fait référence à <label>, qui n’est pas un champ de <modèle>.list_editable[n] fait référence à <label>, qui ne figure pas dans list_display.list_editable[n] ne peut pas être à la fois dans list_editable et dans list_display_links.list_editable[n] fait référence au tout premier champ dans list_display (<label>), qui ne peut pas utilisé tant que list_display_links n’est pas défini.list_editable[n] fait référence à <nom_de_champ>, qui n’est pas modifiable dans l’interface d’administration.search_fields doit être une liste ou un tuple.date_hierarchy fait référence à <nom_de_champ>, qui ne se réfère pas à un champ.date_hierarchy doit être un champ DateField ou DateTimeField.<modeladmin> doit définir une méthode has_<foo>_permission() pour l’action <action>.__name__ des actions définies dans <modeladmin> doivent être uniques. Le nom <nom> n’est pas unique.InlineModelAdmin¶Les contrôles suivants sont effectués sur chaque InlineModelAdmin qui est inscrit comme élément intégré dans une classe ModelAdmin.
<nom_de_champ>, car il s’agit de la clé étrangère vers le modèle parent <étiquette_application>.<modèle>.<modèle> n’a pas de clé ForeignKey vers <modèle parent>./ <modèle> `` a plus d'une clé ``ForeignKey vers <modèle parent>. Vous devez indiquer un attribut fk_name.extra doit être un nombre entier.max_num doit être un nombre entier.min_num doit être un nombre entier.formset doit hériter de BaseModelFormSet.GenericInlineModelAdmin¶Les contrôles suivants sont effectués sur chaque GenericInlineModelAdmin qui est inscrit comme élément intégré dans une classe ModelAdmin.
'champ_ct' fait référence à <label>, qui n’est pas un champ de <modèle>.'champ_ct_fk' fait référence à <label>, qui n’est pas un champ de <modèle>.<modèle> n’a pas de clé GenericForeignKey.<modèle> n’a pas de clé GenericForeignKey utilisant le champ de type de contenu <nom_de_champ> et le champ d’identifiant d’objet <nom_de_champ>.AdminSite¶Les contrôles suivants sont effectués sur l’objet AdminSite par défaut :
django.contrib.contenttypes doit être dans INSTALLED_APPS pour pouvoir utiliser l’application d’administration.django.contrib.auth.context_processors.auth doit être activé dans DjangoTemplates (TEMPLATES) si le moteur d’authentification par défaut est actif pour pouvoir utiliser l’application d’administration.DjangoTemplates doit être configurée dans TEMPLATES pour pouvoir utiliser l’application d’administration.django.contrib.messages.context_processors.messages doit être activé dans DjangoTemplates (TEMPLATES) pour pouvoir utiliser l’application d’administration.django.contrib.auth doit être dans INSTALLED_APPS pour pouvoir utiliser l’application d’administration.django.contrib.messages doit être dans INSTALLED_APPS pour pouvoir utiliser l’application d’administration.django.contrib.auth.middleware.AuthenticationMiddleware doit être dans MIDDLEWARE pour pouvoir utiliser l’application d’administration.django.contrib.messages.middleware.MessageMiddleware doit être dans MIDDLEWARE pour pouvoir utiliser l’application d’administration.django.contrib.sessions.middleware.SessionMiddleware doit être dans MIDDLEWARE pour pouvoir utiliser l’application d’administration.django.template.context_processors.request doit être activé dans DjangoTemplates (TEMPLATES) pour pouvoir utiliser le panneau latéral du site d’administration.auth¶REQUIRED_FIELDS doit être une liste ou un tuple.USERNAME_FIELD pour un modèle utilisateur personnalisé ne doit pas être inclus dans REQUIRED_FIELDS.<champ> doit être unique car il est désigné comme USERNAME_FIELD.<champ> est désigné comme USERNAME_FIELD, mais il n’est pas unique.<nom_code> entre en conflit avec une permission intégrée du modèle <modèle>.<nom_code> est à double pour le modèle <modèle>.verbose_name du modèle <modèle> ne doit pas dépasser 244 caractères pour que ses noms de permissions automatiques ne dépassent pas 255 caractères.<nom> du modèle <modèle> est plus longue que 255 caractères.<modèle utilisateur>.is_anonymous doit être un attribut ou une propriété plutôt qu’une méthode. Il s’agit d’un problème de sécurité car avec une méthode, les utilisateurs anonymes seront considérés comme authentifiés !<modèle utilisateur>.is_authenticated doit être un attribut ou une propriété plutôt qu’une méthode. Il s’agit d’un problème de sécurité car avec une méthode, les utilisateurs anonymes seront considérés comme authentifiés !<modèle> ne doit pas dépasser 93 caractères pour que ses noms de permissions automatiques ne dépassent pas 100 caractères.<nom_code> du modèle <modèle> est plus longue que 100 caractères.contenttypes¶Les contrôles suivants sont effectués quand un modèle contient une clé GenericForeignKey ou une relation GenericRelation:
GenericForeignKey fait référence au champ <field> qui n’existe pas.GenericForeignKey fait référence au champ <field> inexistant.<champ> n’est pas une clé ForeignKey.<field> n’est pas une ForeignKey vers contenttypes.ContentType.postgres¶Les contrôles suivants s’appliquent aux champs de modèle django.contrib.postgres:
<champ> doit être un objet exécutable plutôt qu’une instance afin qu’elle ne soit pas partagée entre toutes les instances de ce champ. Ce contrôle a été modifié en fields.E010 dans Django 3.1.sites¶Les contrôles suivants sont effectués sur chaque modèle utilisant un gestionnaire CurrentSiteManager:
CurrentSiteManager n’a pas réussi à trouver un champ nommé <nom_de_champ>.CurrentSiteManager ne peut pas utiliser <champ> car ce n’est pas une clé étrangère ni un champ plusieurs-à-plusieurs.Les contrôles suivants vérifient que django.contrib.sites est configuré correctement :
SITE_ID doit être un nombre entier.staticfiles¶Les contrôles suivants vérifient que django.contrib.staticfiles est configuré correctement :
STATICFILES_DIRS n’est pas un tuple ni une liste.STATICFILES_DIRS ne doit pas contenir le réglage STATIC_ROOT.<préfixe> dans le réglage STATICFILES_DIRS ne peut pas se terminer par une barre oblique.<répertoire> dans le réglage STATICFILES_DIRS n’existe pas.STORAGES doit définir un stockage de type staticfiles.août 06, 2024