系统检查框架

系统检查框架是一组用于验证 Django 项目的静态检查。它检测常见问题并提供修复建议。该框架是可扩展的,因此您可以轻松添加自己的检查。

有关如何添加自己的检查并将其与 Django 的系统检查集成的详细信息,请参阅系统检查主题指南

API 参考

CheckMessage

class CheckMessage(level, msg, hint=None, obj=None, id=None)[source]

系统检查引发的警告和错误必须是 CheckMessage 的实例。一个实例封装了一个可报告的错误或警告。它还提供适用于消息的上下文和提示,以及用于过滤目的的唯一标识符。

构造函数参数为

level

消息的严重程度。使用预定义值之一:DEBUGINFOWARNINGERRORCRITICAL。如果级别大于或等于 ERROR,则 Django 将阻止管理命令执行。级别低于 ERROR(即警告)的消息将报告到控制台,但可以静默。

msg

一个简短的(少于 80 个字符)字符串,描述了问题。该字符串应包含换行符。

hint

提供修复问题的提示的单行字符串。如果无法提供提示,或者从错误消息中可以明显看出提示,则可以省略提示,或者可以使用 None 值。

obj

可选。提供消息上下文的对象(例如,发现问题的模型)。该对象应该是模型、字段或管理器,或者定义了 __str__() 方法的任何其他对象。该方法用于报告所有消息,其结果在消息之前。

id

可选字符串。问题的唯一标识符。标识符应遵循模式 applabel.X001,其中 X 是字母 CEWID 之一,表示消息严重程度(C 表示严重错误,E 表示错误等)。该数字可以由应用程序分配,但在该应用程序中应唯一。

有一些子类可以更容易地创建具有常见级别的消息。当使用它们时,您可以省略 level 参数,因为它由类名隐含。

class Debug(msg, hint=None, obj=None, id=None)[source]
class Info(msg, hint=None, obj=None, id=None)[source]
class Warning(msg, hint=None obj=None, id=None)[source]
class Error(msg, hint=None, obj=None, id=None)[source]
class Critical(msg, hint=None, obj=None, id=None)[source]

内置标签

Django 的系统检查使用以下标签进行组织

  • admin:任何管理站点声明的检查。

  • async_support:检查与异步相关的配置。

  • caches:检查缓存相关的配置。

  • compatibility:标记版本升级的潜在问题。

  • database:检查数据库相关的配置问题。默认情况下不运行数据库检查,因为它们比常规检查执行更多静态代码分析。它们仅由 migrate 命令或在调用 check 命令时使用 --database 选项指定配置的数据库别名时运行。

  • files:检查文件相关的配置。

  • models:模型、字段和管理器定义的检查。

  • security:检查安全相关的配置。

  • signals:检查信号声明和处理程序注册。

  • sites:检查 django.contrib.sites 配置。

  • staticfiles:检查 django.contrib.staticfiles 配置。

  • templates:检查模板相关的配置。

  • translation: 检查与翻译相关的配置。

  • urls: 检查 URL 配置。

某些检查可能会注册多个标签。

核心系统检查

异步支持

以下检查验证您的设置是否符合 异步支持

向后兼容性

兼容性检查会警告升级 Django 后可能出现的问题。

  • 2_0.W001: 您的 URL 模式 <pattern> 具有包含 route(?P<,以 ^ 开头,或以 $ 结尾。这可能是从 url() 迁移到 path() 时疏忽造成的。

  • 4_0.E001: 从 Django 4.0 开始,CSRF_TRUSTED_ORIGINS 设置中的值必须以方案开头(通常为 http://https://),但发现为 <hostname>

缓存

以下检查验证您的 CACHES 设置是否配置正确

  • caches.E001: 您必须在 CACHES 设置中定义一个 'default' 缓存。

  • caches.W002: 您的 <cache> 配置可能会暴露您的缓存或导致数据损坏,因为其 LOCATIONMEDIA_ROOT/STATIC_ROOT/STATICFILES_DIRS 匹配/位于内部/包含。

  • caches.W003: 您的 <cache> 缓存 LOCATION 是相对路径。请改用绝对路径。

数据库

MySQL 和 MariaDB

如果您使用的是 MySQL 或 MariaDB,则将执行以下检查

  • mysql.E001: MySQL/MariaDB 不允许唯一的 CharField 具有大于 255 的 max_length此检查在 Django 3.1 中更改为 mysql.W003,因为实际的最大大小取决于许多因素。

  • mysql.W002: 数据库连接 <alias> 未设置 MySQL/MariaDB 严格模式。另请参阅 设置 sql_mode

  • mysql.W003: MySQL/MariaDB 可能不允许唯一的 CharField 具有大于 255 的 max_length

文件管理

以下检查验证您的设置是否符合 文件管理

模型字段

  • fields.E001: 字段名称不得以下划线结尾。

  • fields.E002: 字段名称不得包含 "__"

  • fields.E003: pk 是一个保留字,不能用作字段名称。

  • fields.E004: choices 必须是映射(例如字典)或可迭代对象(例如列表或元组)。

  • fields.E005: choices 必须是实际值到人类可读名称的映射,或者包含 (actual value, human readable name) 元组的可迭代对象。

  • fields.E006: db_index 必须为 NoneTrueFalse

  • fields.E007: 主键不得具有 null=True

  • fields.E008: 所有 validators 都必须是可调用的。

  • fields.E009: max_length 太小,无法容纳 choices 中的最长值(<count> 个字符)。

  • fields.E010: <field> 的默认值应为可调用对象,而不是实例,以便它不会在所有字段实例之间共享。

  • fields.E011: <database> 不支持使用表达式(db_default)的默认数据库值。

  • fields.E012: <expression> 不能在 db_default 中使用。

  • fields.E100: AutoField 必须设置 primary_key=True。

  • fields.E110: BooleanField 不接受空值。此检查出现在 Django 2.1 添加对空值的支持之前。

  • fields.E120: CharField 必须定义 max_length 属性。

  • fields.E121: max_length 必须是正整数。

  • fields.W122: 当与 <integer field type> 一起使用时,将忽略 max_length

  • fields.E130: DecimalField 必须定义 decimal_places 属性。

  • fields.E131: decimal_places 必须是非负整数。

  • fields.E132: DecimalField 必须定义 max_digits 属性。

  • fields.E133: max_digits 必须是正整数。

  • fields.E134: max_digits 必须大于或等于 decimal_places

  • fields.E140: FilePathField 必须将 allow_filesallow_folders 设置为 True。

  • fields.E150: 如果 null=False,则 GenericIPAddressField 不能具有 blank=True,因为空值将存储为空值。

  • fields.E160: 选项 auto_nowauto_now_adddefault 是互斥的。这些选项中只能存在一个。

  • fields.W161: 提供了固定默认值。

  • fields.W162: <database> 不支持 <field data type> 列上的数据库索引。

  • fields.W163: <database> 不支持列上的注释(db_comment)。

  • fields.E170: BinaryFielddefault 不能是字符串。请改用字节内容。

  • fields.E180: <database> 不支持 JSONField

  • fields.E190: <database> 不支持在 <field_type> 上设置数据库排序规则。

  • fields.E220: <database> 不支持 GeneratedField

  • fields.E221: <database> 不支持非持久化的 GeneratedField

  • fields.E222: <database> 不支持持久化的 GeneratedField

  • fields.E223: GeneratedField.output_field 存在错误: …

  • fields.W224: GeneratedField.output_field 存在警告: …

  • fields.E900: IPAddressField 已移除,除了在历史迁移中支持外。

  • fields.W900: IPAddressField 已弃用。Django 1.9 中将移除对它的支持(历史迁移除外)。此检查出现在 Django 1.7 和 1.8 中

  • fields.W901: CommaSeparatedIntegerField 已弃用。Django 2.0 中将移除对它的支持(历史迁移除外)。此检查出现在 Django 1.10 和 1.11 中

  • fields.E901: CommaSeparatedIntegerField 已移除,除了在历史迁移中支持外。

  • fields.W902: FloatRangeField 已弃用,将在 Django 3.1 中移除。此检查出现在 Django 2.2 和 3.0 中

  • fields.W903: NullBooleanField 已弃用。Django 4.0 中将移除对它的支持(历史迁移除外)。此检查出现在 Django 3.1 和 3.2 中

  • fields.E903: NullBooleanField 已移除,除了在历史迁移中支持外。

  • fields.W904: django.contrib.postgres.fields.JSONField 已弃用。Django 4.0 中将移除对它的支持(历史迁移除外)。此检查出现在 Django 3.1 和 3.2 中

  • fields.E904: django.contrib.postgres.fields.JSONField 已移除,除了在历史迁移中支持外。

  • fields.W905: django.contrib.postgres.fields.CICharField 已弃用。Django 5.1 中将移除对它的支持(历史迁移除外)。此检查出现在 Django 4.2 和 5.0 中

  • fields.E905: django.contrib.postgres.fields.CICharField 已移除,除了在历史迁移中支持外。

  • fields.W906: django.contrib.postgres.fields.CIEmailField 已弃用。Django 5.1 中将移除对它的支持(历史迁移除外)。此检查出现在 Django 4.2 和 5.0 中

  • fields.E906: django.contrib.postgres.fields.CIEmailField 已移除,除了在历史迁移中支持外。

  • fields.W907: django.contrib.postgres.fields.CITextField 已弃用。Django 5.1 中将移除对它的支持(历史迁移除外)。此检查出现在 Django 4.2 和 5.0 中

  • fields.E907: django.contrib.postgres.fields.CITextField 已移除,除了在历史迁移中支持外。

文件字段

  • fields.E200: unique 不是 FileField 的有效参数。此检查已在 Django 1.11 中移除

  • fields.E201: primary_key 不是 FileField 的有效参数。

  • fields.E202: FileFieldupload_to 参数必须是相对路径,而不是绝对路径。

  • fields.E210: 由于未安装 Pillow,因此无法使用 ImageField

模型

  • models.E001: <swappable> 格式不正确,应为 app_label.app_name

  • models.E002: <SETTING> 引用了 <model>,但该模型未安装或为抽象模型。

  • models.E003: 该模型通过中间模型 <app_label>.<model> 存在两个相同的多对多关系。

  • models.E004: id 只能用作字段名,前提是该字段也设置了 primary_key=True

  • models.E005: 来自父模型 <model> 的字段 <field name> 与来自父模型 <model> 的字段 <field name> 冲突。

  • models.E006: 字段 <field name> 与模型 <model> 中的字段 <field name> 冲突。

  • models.E007: 字段 <field name> 的列名 <column name> 被另一个字段使用。

  • models.E008: index_together 必须是列表或元组。此检查在 Django 5.1 之前出现。

  • models.E009: 所有 index_together 元素都必须是列表或元组。此检查在 Django 5.1 之前出现。

  • models.E010: unique_together 必须是列表或元组。

  • models.E011: 所有 unique_together 元素都必须是列表或元组。

  • models.E012: constraints/indexes/unique_together 引用了不存在的字段 <field name>

  • models.E013: constraints/indexes/unique_together 引用了 ManyToManyField <field name>,但 ManyToManyField 不支持该选项。

  • models.E014: ordering 必须是元组或列表(即使您只想按一个字段排序)。

  • models.E015: ordering 引用了不存在的字段、相关字段或查找 <field name>

  • models.E016: constraints/indexes/unique_together 引用了字段 <field_name>,该字段不属于模型 <model>

  • models.E017: 代理模型 <model> 包含模型字段。

  • models.E018: 字段 <field> 的自动生成列名过长。数据库 <alias> 的最大长度为 <maximum length>

  • models.E019: M2M 字段 <M2M field> 的自动生成列名过长。数据库 <alias> 的最大长度为 <maximum length>

  • models.E020: <model>.check() 类方法当前被覆盖。

  • models.E021: orderingorder_with_respect_to 不能同时使用。

  • models.E022: <function> 包含对 <app label>.<model> 的延迟引用,但应用 <app label> 未安装或未提供模型 <model>

  • models.E023: 模型名称 <model> 不能以下划线开头或结尾,因为它与查询查找语法冲突。

  • models.E024: 模型名称 <model> 不能包含双下划线,因为它与查询查找语法冲突。

  • models.E025: 属性 <property name> 与相关字段访问器冲突。

  • models.E026: 模型不能有多个 primary_key=True 的字段。

  • models.W027: <database> 不支持检查约束。

  • models.E028: db_table <db_table> 被多个模型使用:<model list>

  • models.E029: 索引名称 <index> 对模型 <model> 来说不唯一。

  • models.E030: 索引名称 <index> 在多个模型中不唯一:<model list>

  • models.E031: 约束名称 <constraint> 对模型 <model> 来说不唯一。

  • models.E032: 约束名称 <constraint> 在多个模型中不唯一:<model list>

  • models.E033: 索引名称 <index> 不能以下划线或数字开头。

  • models.E034: 索引名称 <index> 不能超过 <max_length> 个字符。

  • models.W035: db_table <db_table> 被多个模型使用:<model list>

  • models.W036: <database> 不支持带有条件的唯一约束。

  • models.W037: <database> 不支持带有条件的索引。

  • models.W038: <database> 不支持可延迟的唯一约束。

  • models.W039: <database> 不支持包含非键列的唯一约束。

  • models.W040: <database> 不支持包含非键列的索引。

  • models.E041: constraints 引用了连接字段 <field name>

  • models.W042: 在未定义主键类型时使用自动创建的主键,默认情况下为 django.db.models.AutoField

  • models.W043: <database> 不支持表达式索引。

  • models.W044: <database> 不支持表达式唯一约束。

  • models.W045: 检查约束 <constraint> 包含 RawSQL() 表达式,并且在模型 full_clean() 期间不会进行验证。

  • models.W046: <database> 不支持表注释(db_table_comment)。

  • models.W047: <database> 不支持具有不同空值的唯一约束。

安全性

安全检查并不能保证您的网站安全。它们不会审计代码、进行入侵检测,也不会执行任何特别复杂的操作。相反,它们有助于执行一个自动化的、低成本的检查清单,这可以帮助您提高网站的安全性。

其中一些检查可能不适用于您的特定部署配置。例如,如果您在负载均衡器中执行 HTTP 到 HTTPS 的重定向,那么不断收到有关未启用 SECURE_SSL_REDIRECT 的警告会很烦人。使用 SILENCED_SYSTEM_CHECKS 来静默不需要的检查。

如果您使用 check --deploy 选项,则会运行以下检查。

  • security.W001: 您的 MIDDLEWARE 中没有 django.middleware.security.SecurityMiddleware,因此 SECURE_HSTS_SECONDSSECURE_CONTENT_TYPE_NOSNIFFSECURE_REFERRER_POLICYSECURE_CROSS_ORIGIN_OPENER_POLICYSECURE_SSL_REDIRECT 设置将无效。

  • security.W002: 您的 MIDDLEWARE 中没有 django.middleware.clickjacking.XFrameOptionsMiddleware,因此您的页面不会使用 'x-frame-options' 标头进行服务。除非您的网站有充分的理由在框架中提供服务,否则您应该考虑启用此标头以帮助防止点击劫持攻击。

  • security.W003: 您似乎没有通过中间件使用 Django 的内置跨站点请求伪造保护(django.middleware.csrf.CsrfViewMiddleware 不在您的 MIDDLEWARE 中)。启用中间件是确保您不会留下任何漏洞的最安全方法。

  • security.W004: 您没有为 SECURE_HSTS_SECONDS 设置设置值。如果您的整个网站仅通过 SSL 提供服务,则您可能需要考虑设置一个值并启用 HTTP 严格传输安全。请务必先阅读文档;草率地启用 HSTS 会导致严重且不可逆转的问题。

  • security.W005: 您没有将 SECURE_HSTS_INCLUDE_SUBDOMAINS 设置设置为 True。如果没有此设置,您的网站可能会通过对子域名的不安全连接受到攻击。仅当您确定域名的所有子域名都应仅通过 SSL 提供服务时,才将其设置为 True

  • security.W006: 您的 SECURE_CONTENT_TYPE_NOSNIFF 设置未设置为 True,因此您的页面不会使用 'X-Content-Type-Options: nosniff' 标头进行服务。您应该考虑启用此标头以防止浏览器错误地识别内容类型。

  • security.W007: 您的 SECURE_BROWSER_XSS_FILTER 设置未设置为 True,因此您的页面不会使用 'X-XSS-Protection: 1; mode=block' 标头进行服务。您应该考虑启用此标头以激活浏览器的 XSS 过滤并帮助防止 XSS 攻击。此检查在 Django 3.0 中已移除,因为X-XSS-Protection 标头不再受现代浏览器支持。

  • security.W008: 您的 SECURE_SSL_REDIRECT 设置未设置为 True。除非您的网站应通过 SSL 和非 SSL 连接提供服务,否则您可能需要将此设置设置为 True 或配置负载均衡器或反向代理服务器将所有连接重定向到 HTTPS。

  • security.W009: 您的 SECRET_KEY 少于 50 个字符,少于 5 个唯一字符,或者以 'django-insecure-' 为前缀,这表示它是由 Django 自动生成的。请生成一个长而随机的值,否则 Django 的许多安全关键功能将容易受到攻击。

  • security.W010: 您的 INSTALLED_APPS 中包含 django.contrib.sessions,但您尚未将 SESSION_COOKIE_SECURE 设置为 True。使用仅安全会话 cookie 可以使网络流量嗅探器更难以劫持用户会话。

  • security.W011: 您的 MIDDLEWARE 中包含 django.contrib.sessions.middleware.SessionMiddleware,但您尚未将 SESSION_COOKIE_SECURE 设置为 True。使用仅安全会话 cookie 可以使网络流量嗅探器更难以劫持用户会话。

  • security.W012: SESSION_COOKIE_SECURE 未设置为 True。使用仅安全会话 cookie 可以使网络流量嗅探器更难以劫持用户会话。

  • security.W013: 您的 INSTALLED_APPS 中包含 django.contrib.sessions,但您尚未将 SESSION_COOKIE_HTTPONLY 设置为 True。使用 HttpOnly 会话 cookie 可以使跨站点脚本攻击更难以劫持用户会话。

  • security.W014: 您的 MIDDLEWARE 中包含 django.contrib.sessions.middleware.SessionMiddleware,但您尚未将 SESSION_COOKIE_HTTPONLY 设置为 True。使用 HttpOnly 会话 cookie 可以使跨站点脚本攻击更难以劫持用户会话。

  • security.W015: SESSION_COOKIE_HTTPONLY 未设置为 True。使用 HttpOnly 会话 cookie 可以使跨站点脚本攻击更难以劫持用户会话。

  • security.W016: CSRF_COOKIE_SECURE 未设置为 True。使用仅安全 CSRF cookie 可以使网络流量嗅探器更难以窃取 CSRF 令牌。

  • security.W017: CSRF_COOKIE_HTTPONLY 未设置为 True。使用 HttpOnly CSRF cookie 可以使跨站点脚本攻击更难以窃取 CSRF 令牌。此检查在 Django 1.11 中已移除,因为CSRF_COOKIE_HTTPONLY 设置没有实际意义。

  • security.W018:在部署环境中,你不应该将DEBUG设置为True

  • security.W019:你的django.middleware.clickjacking.XFrameOptionsMiddleware位于MIDDLEWARE中,但X_FRAME_OPTIONS没有设置为'DENY'。除非你的网站有充分的理由在框架中提供自身的其他部分,否则你应该将其更改为'DENY'

  • security.W020:在部署环境中,ALLOWED_HOSTS不能为空。

  • security.W021:你没有将SECURE_HSTS_PRELOAD设置为True。没有这个设置,你的网站无法提交到浏览器预加载列表。

  • security.W022:你没有设置SECURE_REFERRER_POLICY。没有这个设置,你的网站将不会发送Referrer-Policy头部。你应该考虑启用此头部以保护用户隐私。

  • security.E023:你将SECURE_REFERRER_POLICY设置为无效值。

  • security.E024:你将SECURE_CROSS_ORIGIN_OPENER_POLICY设置为无效值。

  • security.W025:你的SECRET_KEY_FALLBACKS[n]少于50个字符,少于5个唯一字符,或者以'django-insecure-'开头,这表明它是Django自动生成的。请生成一个长而随机的值,否则Django的许多安全关键功能将容易受到攻击。

以下检查验证你的安全相关设置是否正确配置

  • security.E100DEFAULT_HASHING_ALGORITHM必须是'sha1''sha256'此检查出现在Django 3.1和3.2中

  • security.E101:CSRF失败视图'path.to.view'没有接收正确的参数数量。

  • security.E102:CSRF失败视图'path.to.view'无法导入。

信号

  • signals.E001<handler>已连接到<signal>信号,并使用发送者<app label>.<model>的延迟引用,但应用程序<app label>未安装或未提供模型<model>

模板

以下检查验证你的TEMPLATES设置是否正确配置

  • templates.E001:你的TEMPLATES中同时包含'APP_DIRS': True和在OPTIONS中指定的'loaders'。请移除APP_DIRS或移除'loaders'选项。此检查在Django 5.1中已移除,因为系统检查现在可能会改为引发ImproperlyConfigured

  • templates.E002TEMPLATESOPTIONS中的string_if_invalid必须是字符串,但获取到:{value}{type})。

  • templates.E003<name>被用于多个模板标签模块:<module list>此检查在Django 4.1.2中已更改为templates.W003

  • templates.W003<name>被用于多个模板标签模块:<module list>

翻译

以下检查针对你的翻译配置进行

  • translation.E001:你为LANGUAGE_CODE设置提供了无效值:<value>

  • translation.E002:你为LANGUAGES设置提供了无效的语言代码:<value>

  • translation.E003:你为LANGUAGES_BIDI设置提供了无效的语言代码:<value>

  • translation.E004:你为LANGUAGE_CODE设置提供的数值不在LANGUAGES设置中。

URL

以下检查针对你的URL配置进行

  • urls.W001:你的URL模式<pattern>使用include(),并且route$结尾。请移除route中的美元符号,以避免包含URL时出现问题。

  • urls.W002:你的URL模式<pattern>route/开头。请移除此斜杠,因为它没有必要。如果此模式在include()中被指定,请确保include()模式有一个尾随的/

  • urls.W003:你的URL模式<pattern>name包含一个:。请移除冒号,以避免出现不明确的命名空间引用。

  • urls.E004:你的URL模式<pattern>无效。请确保urlpatterns是一个path()和/或re_path()实例的列表。

  • urls.W005:URL命名空间<namespace>不唯一。你可能无法反转此命名空间中的所有URL。

  • urls.E006MEDIA_URL/STATIC_URL设置必须以斜杠结尾。

  • urls.E007:自定义handlerXXX视图'path.to.view'没有接收正确的参数数量(...)。

  • urls.E008:自定义handlerXXX视图'path.to.view'无法导入。

  • urls.E009:你的URL模式<pattern>的视图无效,请传入<view>.as_view()而不是<view>

  • urls.W010:你的URL模式<pattern>存在不匹配的<angle bracket>

contrib应用程序检查

admin

所有管理员检查都在 admin 标签下执行。

以下检查会对注册到管理员站点上的任何 ModelAdmin(或其子类)执行。

  • admin.E001raw_id_fields 的值必须是列表或元组。

  • admin.E002raw_id_fields[n] 的值引用了 <field name>,它不是 <model> 的字段。

  • admin.E003raw_id_fields[n] 的值必须是外键或多对多字段。

  • admin.E004fields 的值必须是列表或元组。

  • admin.E005:同时指定了 fieldsetsfields

  • admin.E006fields 的值包含重复的字段。

  • admin.E007fieldsets 的值必须是列表或元组。

  • admin.E008fieldsets[n] 的值必须是列表或元组。

  • admin.E009fieldsets[n] 的值必须是长度为 2 的列表或元组。

  • admin.E010fieldsets[n][1] 的值必须是字典。

  • admin.E011fieldsets[n][1] 的值必须包含键 fields

  • admin.E012fieldsets[n][1] 中存在重复的字段。

  • admin.E013fields[n]/filter_horizontal[n]/filter_vertical[n]/fieldsets[n][m] 的值不能包含 ManyToManyField <field name>,因为该字段手动指定了关系模型。

  • admin.E014exclude 的值必须是列表或元组。

  • admin.E015exclude 的值包含重复的字段。

  • admin.E016form 的值必须继承自 BaseModelForm

  • admin.E017filter_vertical 的值必须是列表或元组。

  • admin.E018filter_horizontal 的值必须是列表或元组。

  • admin.E019filter_vertical[n]/filter_horizontal[n] 的值引用了 <field name>,它不是 <model> 的字段。

  • admin.E020filter_vertical[n]/filter_horizontal[n] 的值必须是多对多字段。

  • admin.E021radio_fields 的值必须是字典。

  • admin.E022radio_fields 的值引用了 <field name>,它不是 <model> 的字段。

  • admin.E023radio_fields 的值引用了 <field name>,它不是 ForeignKey 的实例,并且没有 choices 定义。

  • admin.E024radio_fields[<field name>] 的值必须是 admin.HORIZONTALadmin.VERTICAL

  • admin.E025view_on_site 的值必须是可调用对象或布尔值。

  • admin.E026prepopulated_fields 的值必须是字典。

  • admin.E027prepopulated_fields 的值引用了 <field name>,它不是 <model> 的字段。

  • admin.E028prepopulated_fields 的值引用了 <field name>,它不能是 DateTimeFieldForeignKeyOneToOneFieldManyToManyField 字段。

  • admin.E029prepopulated_fields[<field name>] 的值必须是列表或元组。

  • admin.E030prepopulated_fields 的值引用了 <field name>,它不是 <model> 的字段。

  • admin.E031ordering 的值必须是列表或元组。

  • admin.E032ordering 的值包含随机排序标记 ?,但也包含其他字段。

  • admin.E033ordering 的值引用了 <field name>,它不是 <model> 的字段。

  • admin.E034readonly_fields 的值必须是列表或元组。

  • admin.E035readonly_fields[n] 的值引用了 <field_name>,它不是可调用对象、<ModelAdmin class> 的属性或 <model> 的属性或方法。

  • admin.E036autocomplete_fields 的值必须是列表或元组。

  • admin.E037autocomplete_fields[n] 的值引用了 <field name>,它不是 <model> 的字段。

  • admin.E038autocomplete_fields[n] 的值必须是外键或多对多字段。

  • admin.E039:模型 <model> 的管理员必须注册才能被 <modeladmin>.autocomplete_fields 引用。

  • admin.E040<modeladmin> 必须定义 search_fields,因为它被 <other_modeladmin>.autocomplete_fields 引用。

ModelAdmin

以下检查会对注册到管理员站点上的任何 ModelAdmin 执行。

  • admin.E101save_as 的值必须是布尔值。

  • admin.E102save_on_top 的值必须是布尔值。

  • admin.E103inlines 的值必须是列表或元组。

  • admin.E104<InlineModelAdmin class> 必须继承自 InlineModelAdmin

  • admin.E105<InlineModelAdmin class> 必须具有 model 属性。

  • admin.E106<InlineModelAdmin class>.model 的值必须是 Model

  • admin.E107list_display 的值必须是列表或元组。

  • admin.E108list_display[n] 的值引用了 <label>,它不是可调用对象或 <ModelAdmin class> 的属性,或 <model> 上的属性、方法或字段。

  • admin.E109list_display[n] 的值不能是多对多字段或反向外键。

  • admin.E110list_display_links 的值必须是列表、元组或 None

  • admin.E111list_display_links[n] 指向 <label>,它在 list_display 中未定义。

  • admin.E112list_filter 的值必须是列表或元组。

  • admin.E113list_filter[n] 的值必须继承自 ListFilter

  • admin.E114list_filter[n] 的值不能继承自 FieldListFilter

  • admin.E115list_filter[n][1] 的值必须继承自 FieldListFilter

  • admin.E116list_filter[n] 指向 <label>,它不指向任何字段。

  • admin.E117list_select_related 的值必须是布尔值、元组或列表。

  • admin.E118list_per_page 的值必须是整数。

  • admin.E119list_max_show_all 的值必须是整数。

  • admin.E120list_editable 的值必须是列表或元组。

  • admin.E121list_editable[n] 指向 <label>,它不是 <model> 的字段。

  • admin.E122list_editable[n] 指向 <label>,它未包含在 list_display 中。

  • admin.E123list_editable[n] 不能同时存在于 list_editablelist_display_links 中。

  • admin.E124list_editable[n] 指向 list_display 中的第一个字段 (<label>),除非设置了 list_display_links,否则无法使用。

  • admin.E125list_editable[n] 指向 <field name>,它无法通过管理员进行编辑。

  • admin.E126search_fields 的值必须是列表或元组。

  • admin.E127date_hierarchy 指向 <field name>,它不指向任何字段。

  • admin.E128date_hierarchy 的值必须是 DateFieldDateTimeField

  • admin.E129<modeladmin> 必须为 <action> 操作定义一个 has_<foo>_permission() 方法。

  • admin.E130:在 <modeladmin> 中定义的操作的 __name__ 属性必须是唯一的。名称 <name> 不唯一。

InlineModelAdmin

以下检查针对在 ModelAdmin 上注册为内联的任何 InlineModelAdmin 进行。

  • admin.E201:无法排除字段 <field name>,因为它是对父模型 <app_label>.<model> 的外键。

  • admin.E202<model> 没有指向 <parent model>ForeignKey。/<model> 指向 <parent model>ForeignKey 超过一个。您必须指定 fk_name 属性。

  • admin.E203extra 的值必须是整数。

  • admin.E204max_num 的值必须是整数。

  • admin.E205min_num 的值必须是整数。

  • admin.E206formset 的值必须继承自 BaseModelFormSet

GenericInlineModelAdmin

以下检查针对在 ModelAdmin 上注册为内联的任何 GenericInlineModelAdmin 进行。

  • admin.E301'ct_field' 指向 <label>,它不是 <model> 上的字段。

  • admin.E302'ct_fk_field' 指向 <label>,它不是 <model> 上的字段。

  • admin.E303<model> 没有 GenericForeignKey

  • admin.E304<model> 没有使用内容类型字段 <field name> 和对象 ID 字段 <field name>GenericForeignKey

AdminSite

以下检查针对默认的 AdminSite 进行。

auth

  • auth.E001REQUIRED_FIELDS 必须是列表或元组。

  • auth.E002:自定义用户模型中名为 USERNAME_FIELD 的字段不得包含在 REQUIRED_FIELDS 中。

  • auth.E003<field> 必须唯一,因为它被命名为 USERNAME_FIELD

  • auth.W004<field> 被命名为 USERNAME_FIELD,但它不唯一。

  • auth.E005:权限代码名为 <codename> 与模型 <model> 的内置权限冲突。

  • auth.E006:权限代码名为 <codename> 在模型 <model> 中重复。

  • auth.E007:模型 <model>verbose_name 必须最多为 244 个字符,才能使其内置权限名称最多为 255 个字符。

  • auth.E008:模型 <model> 的名为 <name> 的权限长度超过 255 个字符。

  • auth.C009<User model>.is_anonymous 必须是属性或特性,而不是方法。忽略此问题是一个安全问题,因为匿名用户将被视为已认证!

  • auth.C010<User model>.is_authenticated 必须是属性或特性,而不是方法。忽略此问题是一个安全问题,因为匿名用户将被视为已认证!

  • auth.E011:模型 <model> 的名称必须最多为 93 个字符,才能使其内置权限名称最多为 100 个字符。

  • auth.E012:模型 <model> 的权限代码名为 <codename> 长度超过 100 个字符。

  • auth.E013:为了使用 django.contrib.auth.middleware.LoginRequiredMiddleware,必须在 MIDDLEWARE 中先定义 django.contrib.auth.middleware.AuthenticationMiddleware

contenttypes

当模型包含 GenericForeignKeyGenericRelation 时,将执行以下检查

  • contenttypes.E001GenericForeignKey 对象 ID 引用了不存在的字段 <field>

  • contenttypes.E002GenericForeignKey 内容类型引用了不存在的字段 <field>

  • contenttypes.E003<field> 不是 ForeignKey

  • contenttypes.E004<field> 不是对 contenttypes.ContentTypeForeignKey

  • contenttypes.E005:模型名称必须最多为 100 个字符。

postgres

django.contrib.postgres 模型字段执行以下检查

  • postgres.E001:数组的基本字段存在错误:…

  • postgres.E002:数组的基本字段不能是相关字段。

  • postgres.E003<field> 的默认值应为可调用对象,而不是实例,以便它不会在所有字段实例之间共享。此检查在 Django 3.1 中更改为 fields.E010

  • postgres.W004:数组的基本字段存在警告:…

sites

对使用 CurrentSiteManager 的任何模型执行以下检查

  • sites.E001CurrentSiteManager 找不到名为 <field name> 的字段。

  • sites.E002CurrentSiteManager 不能使用 <field>,因为它不是外键或多对多字段。

以下检查验证 django.contrib.sites 是否已正确配置

  • sites.E101SITE_ID 设置必须是整数。

staticfiles

以下检查验证 django.contrib.staticfiles 是否已正确配置

返回顶部