系统检查框架¶
系统检查框架是一组用于验证 Django 项目的静态检查。它检测常见问题并提供修复建议。该框架是可扩展的,因此您可以轻松添加自己的检查。
有关如何添加自己的检查并将其与 Django 的系统检查集成的详细信息,请参阅系统检查主题指南。
API 参考¶
CheckMessage
¶
系统检查引发的警告和错误必须是 CheckMessage
的实例。一个实例封装了一个可报告的错误或警告。它还提供适用于消息的上下文和提示,以及用于过滤目的的唯一标识符。
构造函数参数为
level
消息的严重程度。使用预定义值之一:
DEBUG
、INFO
、WARNING
、ERROR
、CRITICAL
。如果级别大于或等于ERROR
,则 Django 将阻止管理命令执行。级别低于ERROR
(即警告)的消息将报告到控制台,但可以静默。msg
一个简短的(少于 80 个字符)字符串,描述了问题。该字符串不应包含换行符。
hint
提供修复问题的提示的单行字符串。如果无法提供提示,或者从错误消息中可以明显看出提示,则可以省略提示,或者可以使用
None
值。obj
可选。提供消息上下文的对象(例如,发现问题的模型)。该对象应该是模型、字段或管理器,或者定义了
__str__()
方法的任何其他对象。该方法用于报告所有消息,其结果在消息之前。id
可选字符串。问题的唯一标识符。标识符应遵循模式
applabel.X001
,其中X
是字母CEWID
之一,表示消息严重程度(C
表示严重错误,E
表示错误等)。该数字可以由应用程序分配,但在该应用程序中应唯一。
有一些子类可以更容易地创建具有常见级别的消息。当使用它们时,您可以省略 level
参数,因为它由类名隐含。
核心系统检查¶
异步支持¶
以下检查验证您的设置是否符合 异步支持
async.E001: 您不应该在部署中设置
DJANGO_ALLOW_ASYNC_UNSAFE
环境变量。这将禁用 异步安全保护。
向后兼容性¶
兼容性检查会警告升级 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>
配置可能会暴露您的缓存或导致数据损坏,因为其LOCATION
与MEDIA_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
。
文件管理¶
以下检查验证您的设置是否符合 文件管理
files.E001:
FILE_UPLOAD_TEMP_DIR
设置引用不存在的目录<path>
。
模型字段¶
fields.E001: 字段名称不得以下划线结尾。
fields.E002: 字段名称不得包含
"__"
。fields.E003:
pk
是一个保留字,不能用作字段名称。fields.E004:
choices
必须是映射(例如字典)或可迭代对象(例如列表或元组)。fields.E005:
choices
必须是实际值到人类可读名称的映射,或者包含(actual value, human readable name)
元组的可迭代对象。fields.E006:
db_index
必须为None
、True
或False
。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_files
或allow_folders
设置为 True。fields.E150: 如果
null=False
,则GenericIPAddressField
不能具有blank=True
,因为空值将存储为空值。fields.E160: 选项
auto_now
、auto_now_add
和default
是互斥的。这些选项中只能存在一个。fields.W161: 提供了固定默认值。
fields.W162:
<database>
不支持<field data type>
列上的数据库索引。fields.W163:
<database>
不支持列上的注释(db_comment
)。fields.E170:
BinaryField
的default
不能是字符串。请改用字节内容。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:
FileField
的upload_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:
ordering
和order_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_SECONDS
、SECURE_CONTENT_TYPE_NOSNIFF
、SECURE_REFERRER_POLICY
、SECURE_CROSS_ORIGIN_OPENER_POLICY
和SECURE_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.E100:
DEFAULT_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.E002:
TEMPLATES
OPTIONS
中的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.E006:
MEDIA_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.E001:
raw_id_fields
的值必须是列表或元组。admin.E002:
raw_id_fields[n]
的值引用了<field name>
,它不是<model>
的字段。admin.E003:
raw_id_fields[n]
的值必须是外键或多对多字段。admin.E004:
fields
的值必须是列表或元组。admin.E005:同时指定了
fieldsets
和fields
。admin.E006:
fields
的值包含重复的字段。admin.E007:
fieldsets
的值必须是列表或元组。admin.E008:
fieldsets[n]
的值必须是列表或元组。admin.E009:
fieldsets[n]
的值必须是长度为 2 的列表或元组。admin.E010:
fieldsets[n][1]
的值必须是字典。admin.E011:
fieldsets[n][1]
的值必须包含键fields
。admin.E012:
fieldsets[n][1]
中存在重复的字段。admin.E013:
fields[n]/filter_horizontal[n]/filter_vertical[n]/fieldsets[n][m]
的值不能包含ManyToManyField
<field name>
,因为该字段手动指定了关系模型。admin.E014:
exclude
的值必须是列表或元组。admin.E015:
exclude
的值包含重复的字段。admin.E016:
form
的值必须继承自BaseModelForm
。admin.E017:
filter_vertical
的值必须是列表或元组。admin.E018:
filter_horizontal
的值必须是列表或元组。admin.E019:
filter_vertical[n]/filter_horizontal[n]
的值引用了<field name>
,它不是<model>
的字段。admin.E020:
filter_vertical[n]/filter_horizontal[n]
的值必须是多对多字段。admin.E021:
radio_fields
的值必须是字典。admin.E022:
radio_fields
的值引用了<field name>
,它不是<model>
的字段。admin.E023:
radio_fields
的值引用了<field name>
,它不是ForeignKey
的实例,并且没有choices
定义。admin.E024:
radio_fields[<field name>]
的值必须是admin.HORIZONTAL
或admin.VERTICAL
。admin.E025:
view_on_site
的值必须是可调用对象或布尔值。admin.E026:
prepopulated_fields
的值必须是字典。admin.E027:
prepopulated_fields
的值引用了<field name>
,它不是<model>
的字段。admin.E028:
prepopulated_fields
的值引用了<field name>
,它不能是DateTimeField
、ForeignKey
、OneToOneField
或ManyToManyField
字段。admin.E029:
prepopulated_fields[<field name>]
的值必须是列表或元组。admin.E030:
prepopulated_fields
的值引用了<field name>
,它不是<model>
的字段。admin.E031:
ordering
的值必须是列表或元组。admin.E032:
ordering
的值包含随机排序标记?
,但也包含其他字段。admin.E033:
ordering
的值引用了<field name>
,它不是<model>
的字段。admin.E034:
readonly_fields
的值必须是列表或元组。admin.E035:
readonly_fields[n]
的值引用了<field_name>
,它不是可调用对象、<ModelAdmin class>
的属性或<model>
的属性或方法。admin.E036:
autocomplete_fields
的值必须是列表或元组。admin.E037:
autocomplete_fields[n]
的值引用了<field name>
,它不是<model>
的字段。admin.E038:
autocomplete_fields[n]
的值必须是外键或多对多字段。admin.E039:模型
<model>
的管理员必须注册才能被<modeladmin>.autocomplete_fields
引用。admin.E040:
<modeladmin>
必须定义search_fields
,因为它被<other_modeladmin>.autocomplete_fields
引用。
ModelAdmin
¶
以下检查会对注册到管理员站点上的任何 ModelAdmin
执行。
admin.E101:
save_as
的值必须是布尔值。admin.E102:
save_on_top
的值必须是布尔值。admin.E103:
inlines
的值必须是列表或元组。admin.E104:
<InlineModelAdmin class>
必须继承自InlineModelAdmin
。admin.E105:
<InlineModelAdmin class>
必须具有model
属性。admin.E106:
<InlineModelAdmin class>.model
的值必须是Model
。admin.E107:
list_display
的值必须是列表或元组。admin.E108:
list_display[n]
的值引用了<label>
,它不是可调用对象或<ModelAdmin class>
的属性,或<model>
上的属性、方法或字段。admin.E109:
list_display[n]
的值不能是多对多字段或反向外键。admin.E110:
list_display_links
的值必须是列表、元组或None
。admin.E111:
list_display_links[n]
指向<label>
,它在list_display
中未定义。admin.E112:
list_filter
的值必须是列表或元组。admin.E113:
list_filter[n]
的值必须继承自ListFilter
。admin.E114:
list_filter[n]
的值不能继承自FieldListFilter
。admin.E115:
list_filter[n][1]
的值必须继承自FieldListFilter
。admin.E116:
list_filter[n]
指向<label>
,它不指向任何字段。admin.E117:
list_select_related
的值必须是布尔值、元组或列表。admin.E118:
list_per_page
的值必须是整数。admin.E119:
list_max_show_all
的值必须是整数。admin.E120:
list_editable
的值必须是列表或元组。admin.E121:
list_editable[n]
指向<label>
,它不是<model>
的字段。admin.E122:
list_editable[n]
指向<label>
,它未包含在list_display
中。admin.E123:
list_editable[n]
不能同时存在于list_editable
和list_display_links
中。admin.E124:
list_editable[n]
指向list_display
中的第一个字段 (<label>
),除非设置了list_display_links
,否则无法使用。admin.E125:
list_editable[n]
指向<field name>
,它无法通过管理员进行编辑。admin.E126:
search_fields
的值必须是列表或元组。admin.E127:
date_hierarchy
指向<field name>
,它不指向任何字段。admin.E128:
date_hierarchy
的值必须是DateField
或DateTimeField
。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.E203:
extra
的值必须是整数。admin.E204:
max_num
的值必须是整数。admin.E205:
min_num
的值必须是整数。admin.E206:
formset
的值必须继承自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
进行。
admin.E401:为了使用管理员应用程序,
django.contrib.contenttypes
必须位于INSTALLED_APPS
中。admin.E402:如果使用默认的身份验证后端,为了使用管理员应用程序,必须在
DjangoTemplates
(TEMPLATES
) 中启用django.contrib.auth.context_processors.auth
。admin.E403:为了使用管理员应用程序,必须在
TEMPLATES
中配置django.template.backends.django.DjangoTemplates
实例。admin.E404:为了使用管理员应用程序,必须在
DjangoTemplates
(TEMPLATES
) 中启用django.contrib.messages.context_processors.messages
。admin.E405:为了使用 admin 应用程序,必须将
django.contrib.auth
添加到INSTALLED_APPS
中。admin.E406:为了使用 admin 应用程序,必须将
django.contrib.messages
添加到INSTALLED_APPS
中。admin.E408:为了使用 admin 应用程序,必须将
django.contrib.auth.middleware.AuthenticationMiddleware
添加到MIDDLEWARE
中。admin.E409:为了使用 admin 应用程序,必须将
django.contrib.messages.middleware.MessageMiddleware
添加到MIDDLEWARE
中。admin.E410:为了使用 admin 应用程序,必须将
django.contrib.sessions.middleware.SessionMiddleware
添加到MIDDLEWARE
中。admin.W411:为了使用 admin 导航侧边栏,必须在
DjangoTemplates
(TEMPLATES
)中启用django.template.context_processors.request
。
auth
¶
auth.E001:
REQUIRED_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
¶
当模型包含 GenericForeignKey
或 GenericRelation
时,将执行以下检查
contenttypes.E001:
GenericForeignKey
对象 ID 引用了不存在的字段<field>
。contenttypes.E002:
GenericForeignKey
内容类型引用了不存在的字段<field>
。contenttypes.E003:
<field>
不是ForeignKey
。contenttypes.E004:
<field>
不是对contenttypes.ContentType
的ForeignKey
。contenttypes.E005:模型名称必须最多为 100 个字符。
postgres
¶
对 django.contrib.postgres
模型字段执行以下检查
postgres.E001:数组的基本字段存在错误:…
postgres.E002:数组的基本字段不能是相关字段。
postgres.E003:
<field>
的默认值应为可调用对象,而不是实例,以便它不会在所有字段实例之间共享。此检查在 Django 3.1 中更改为fields.E010
。postgres.W004:数组的基本字段存在警告:…
sites
¶
对使用 CurrentSiteManager
的任何模型执行以下检查
sites.E001:
CurrentSiteManager
找不到名为<field name>
的字段。sites.E002:
CurrentSiteManager
不能使用<field>
,因为它不是外键或多对多字段。
以下检查验证 django.contrib.sites
是否已正确配置
sites.E101:
SITE_ID
设置必须是整数。
staticfiles
¶
以下检查验证 django.contrib.staticfiles
是否已正确配置
staticfiles.E001:
STATICFILES_DIRS
设置不是元组或列表。staticfiles.E002:
STATICFILES_DIRS
设置不应包含STATIC_ROOT
设置。staticfiles.E003:
STATICFILES_DIRS
设置中的前缀<prefix>
不得以斜杠结尾。staticfiles.W004:
STATICFILES_DIRS
中的目录<directory>
不存在。staticfiles.E005:
STORAGES
设置必须定义一个staticfiles
存储。