Django的完美主义者的网络框架

系统检查框架

系统检查框架是一组用于验证Django项目的静态检查。它可以检测常见问题并提供有关如何解决这些问题的提示。该框架是可扩展的,因此您可以轻松添加自己的检查。

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

API参考

CheckMessage

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

构造函数参数是:

image-20221210214917172

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

image-20221210214935379

内置标签

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

  • admin:检查任何管理站点声明。
  • caches:检查缓存相关配置。
  • compatibility:标记版本升级的潜在问题。
  • database:检查与数据库相关的配置问题。默认情况下不运行数据库检查,因为它们不像常规检查那样执行静态代码分析。它们仅由migrate命令运行,或者database在调用check命令时指定标记。
  • models:检查模型,字段和管理器定义。
  • security:检查与安全相关的配置。
  • signals:检查信号声明和处理程序注册。
  • staticfiles:检查django.contrib.staticfiles配置。
  • templates:检查模板相关配置。
  • translation:检查翻译相关配置。
  • urls:检查URL配置。

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

核心系统检查

向后兼容性

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

  • 2_0.W001:您的网址格式<pattern>包含a route(?P<以a开头^或以a结尾$。从迁移url()到移民时,这可能是一种疏忽path()

缓存

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

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

数据库

MySQL的

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

  • mysql.E001:MySQL不允许唯一的CharFields具有 max_length> 255。
  • mysql.W002:没有为数据库连接’‘设置MySQL严格模式。另请参见设置sql_mode

模型字段

  • fields.E001:字段名称不能以下划线结尾。
  • fields.E002:字段名称不得包含"__"
  • fields.E003pk是一个不能用作字段名称的保留字。
  • fields.E004choices必须是可迭代的(例如,列表或元组)。
  • fields.E005choices必须是可迭代的返回元组。(actual value, human readable name)
  • fields.E006db_index必须是NoneTrueFalse
  • fields.E007:主键不能有null=True
  • fields.E008:All validators必须是可调用的。
  • fields.E100AutoFields必须设置primary_key = True。
  • fields.E110BooleanFields不接受空值。在Django 2.1中添加了对空值的支持之前出现了此检查。
  • fields.E120CharFields必须定义一个max_length属性。
  • fields.E121max_length必须是正整数。
  • fields.W122max_length使用时被忽略 。<integer field type>
  • fields.E130DecimalFields必须定义一个decimal_places属性。
  • fields.E131decimal_places必须是非负整数。
  • fields.E132DecimalFields必须定义一个max_digits属性。
  • fields.E133max_digits必须是非负整数。
  • fields.E134max_digits必须大于或等于decimal_places
  • fields.E140FilePathFields必须具有allow_filesallow_folders设置为True。
  • fields.E150GenericIPAddressField如果不允许空值,则s不能接受空值,因为空值存储为空值。
  • fields.E160:选项auto_nowauto_now_adddefault 互斥。这些选项中只有一个可能存在。
  • fields.W161:提供固定的默认值。
  • fields.W162<database>不支持列上的数据库索引 。<field data type>
  • fields.E170BinaryField‘s default不能是一个字符串。请改用字节内容。
  • fields.E900IPAddressField已被删除,但历史迁移支持除外。
  • fields.W900IPAddressField已被弃用。Django 1.9将删除对它的支持(历史迁移除外)。这个检查出现在Django 1.7和1.8中
  • fields.W901CommaSeparatedIntegerField已被弃用。Django 2.0将删除对它的支持(历史迁移除外)。这个检查出现在Django 1.10和1.11中
  • fields.E901CommaSeparatedIntegerField除历史迁移中的支持外被删除。
  • fields.W902FloatRangeField已弃用,将在Django 3.1中删除。

文件字段

  • fields.E200unique不是a的有效参数FileField在Django 1.11中删除了此检查
  • fields.E201primary_key不是a的有效参数FileField
  • fields.E202FileFieldupload_to参数必须是相对路径,而不是绝对路径。
  • fields.E210:无法使用,ImageField因为未安装Pillow。

相关领域

  • fields.E300:Field定义与模型的关系<model>,该模型未安装或是抽象的。
  • fields.E301:Field定义与<model>已换出的模型的关系。
  • fields.E302:字段与字段冲突的 访问者。<field name>``<field name>
  • fields.E303:字段与字段冲突的反向查询名称。<field name>``<field name>
  • fields.E304:字段名称与访问者的冲突 。<field name>``<field name>
  • fields.E305:字段名称与反向查询名称冲突。<field name>``<field name>
  • fields.E306:相关名称必须是有效的Python标识符或以'+'。结尾。
  • fields.E307:该字段是使用延迟引用声明的,但未 安装app 或不提供模型。<app label>.<model>.<field name>``<app label>.<model>``<app label>``<model>
  • fields.E308:反向查询名称不得以下划线结尾。<related query name>
  • fields.E309:反向查询名称不得包含 。<related query name>``'__'
  • fields.E310:字段没有子集<field1><field2>…型号<model>是独一无二的。添加unique=True任何这些字段或将至少一部分字段添加到unique_together约束。
  • fields.E311<model>必须设置,unique=True因为它被a引用ForeignKey
  • fields.E312:相关模型上不存在。to_field <field name>``<app label>.<model>
  • fields.E320:Field指定on_delete=SET_NULL,但不能为null。
  • fields.E321:该字段指定on_delete=SET_DEFAULT,但没有默认值。
  • fields.E330ManyToManyFields不能是唯一的。
  • fields.E331:Field通过模型指定多对多关系<model>,该关系 尚未安装。
  • fields.E332:具有中间表的多对多字段不能是对称的。
  • fields.E333:该模型用作中间模型<model>,但它有两个以上的外键<model>,这是不明确的。您必须通过through_fields关键字参数指定Django应使用哪两个外键 。
  • fields.E334:该模型用作中间模型<model>,但它有多个外键<model>,这是不明确的。您必须通过through_fields关键字参数指定Django应使用哪个外键 。
  • fields.E335:该模型用作中间模型<model>,但它有多个外键<model>,这是不明确的。您必须通过through_fields关键字参数指定Django应使用哪个外键 。
  • fields.E336:该模型用作中间模型<model>,但它没有外键<model><model>
  • fields.E337:Field指定through_fields但不提供应该用于关系的两个链接字段的名称 <model>
  • fields.E338:中间模型没有字段 。<through model>``<field name>
  • fields.E339:不是外键。<model>.<field name>``<model>
  • fields.E340:字段的中间表与表名/ 冲突。<table name>``<model>``<model>.<field name>
  • fields.W340null没有效果ManyToManyField
  • fields.W341ManyToManyField不支持validators
  • fields.W342unique=True在a ForeignKey上设置与使用a 具有相同的效果OneToOneField
  • fields.W343limit_choices_to有没有影响ManyToManyFieldthrough模型。

型号

  • models.E001<swappable>不是表格app_label.app_name
  • models.E002:尚未安装或是抽象的<SETTING>引用<model>
  • models.E003:模型通过中间模型具有两个相同的多对多关系<app_label>.<model>
  • models.E004id如果字段也设置,则只能用作字段名称primary_key=True
  • models.E005:父模型中 的字段与父模型中的字段冲突。<field name>``<model>``<field name>``<model>
  • models.E006:该字段与模型中 的字段冲突。<field name>``<model>
  • models.E007:字段具有 另一个字段使用的列名。<field name>``<column name>
  • models.E008index_together必须是列表或元组。
  • models.E009:所有index_together元素必须是列表或元组。
  • models.E010unique_together必须是列表或元组。
  • models.E011:所有unique_together元素必须是列表或元组。
  • models.E012indexes/index_together/unique_together指不存在的字段。<field name>
  • models.E013indexes/index_together/unique_together指的是a ,但该选项不支持s。ManyToManyField <fieldname>``ManyToManyField
  • models.E014ordering必须是元组或列表(即使您只想按一个字段排序)。
  • models.E015ordering指不存在的字段,相关字段或查找。<field name>
  • models.E016indexes/index_together/unique_together指的<field_name>是不是模型本地的字段 <model>
  • models.E017:代理模型<model>包含模型字段。
  • models.E018:字段的自动生成列名称太长<field>。数据库的最大长度。<maximum length>``<alias>
  • models.E019:自动生成的列名称对于M2M字段来说太长 。数据库的 最大长度。<M2M field>``<maximum length>``<alias>
  • models.E020<model>.check()当前重写了类方法。
  • models.E021orderingorder_with_respect_to不能一起使用。
  • models.E022<function>包含一个惰性引用 ,但app 未安装或未提供模型。<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.E028db_table <db_table>由多个模型使用: 。<model list>
  • models.E029:索引名称<index>对于模型不是唯一的<model>
  • models.E030:索引名称<index>在模型中不是唯一的: 。<model list>
  • models.E031:约束名称<constraint>对于模型不是唯一的 <model>
  • models.E032:约束名称<constraint>在模型中不是唯一的:。<model list>

安全

安全检查不会确保您的网站安全。他们不审核代码,进行入侵检测,也不做任何特别复杂的事情。相反,它们有助于执行自动化,低悬的水果清单。它们可以帮助您记住提高网站安全性的简单方法。

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

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

信号

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

模板

以下检查验证您的TEMPLATES设置是否已正确配置:

  • templates.E001:你有你的 ,但还指定的。删除或删除选项。'APP_DIRS':TrueTEMPLATES'loaders'``OPTIONS``APP_DIRS``'loaders'
  • templates.E002string_if_invalid在必须是一个字符串,但得到: ()。TEMPLATES OPTIONS{value}``{type}

翻译

对您的翻译配置执行以下检查:

  • translation.E001:您为该设置提供了无效值 LANGUAGE_CODE<value>
  • translation.E002:您在设置中提供了无效的语言代码 LANGUAGES<value>
  • translation.E003:您在设置中提供了无效的语言代码 LANGUAGES_BIDI<value>
  • translation.E004:您为LANGUAGE_CODE设置中没有的LANGUAGES 设置提供了值 。

网址

对URL配置执行以下检查:

  • urls.W001:您的网址格式<pattern>使用 include()带有route结尾的$。从中删除美元route以避免包括URL在内的问题。
  • urls.W002:您的网址格式<pattern>以a route开头/。因为没必要,请删除此斜杠。如果此模式以a为目标include(),请确保include() 模式具有尾随/
  • urls.W003:您的URL模式<pattern>name 包括:。删除冒号,以避免不明确的命名空间引用。
  • urls.E004:您的网址格式<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'

contrib应用检查

admin

管理员检查全部作为admin标签的一部分执行。

ModelAdmin在admin站点注册的任何(或子类)执行以下检查 :

  • admin.E001:值raw_id_fields必须是列表或元组。
  • admin.E002raw_id_fields[n]引用的值,不是属性。<field name>``<model>
  • admin.E003:值raw_id_fields[n]必须是外键或多对多字段。
  • admin.E004:值fields必须是列表或元组。
  • admin.E005:两个fieldsetsfields指定。
  • admin.E006fields包含重复字段的值。
  • 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.E013fields[n]/fieldsets[n][m]不能包含 ,因为该字段手动指定关系模型。ManyToManyField <field name>
  • admin.E014:值exclude必须是列表或元组。
  • admin.E015exclude包含重复字段的值。
  • admin.E016form必须继承的值BaseModelForm
  • admin.E017:值filter_vertical必须是列表或元组。
  • admin.E018:值filter_horizontal必须是列表或元组。
  • admin.E019filter_vertical[n]/filter_vertical[n]引用的值,不是属性。<field name>``<model>
  • admin.E020:值filter_vertical[n]/filter_vertical[n]必须是多对多字段。
  • admin.E021:值radio_fields必须是字典。
  • admin.E022radio_fields引用的值,不是属性。<field name>``<model>
  • admin.E023radio_fields引用的值,不是a ,也没有定义。<field name>``ForeignKey``choices
  • admin.E024:值必须是 或者。radio_fields[<field name>]``admin.HORIZONTAL``admin.VERTICAL
  • admin.E025:值view_on_site必须是可调用值或布尔值。
  • admin.E026:值prepopulated_fields必须是字典。
  • admin.E027prepopulated_fields引用 的值,不是属性。<field name>``<model>
  • admin.E028prepopulated_fields引用 的值,不能是a ,a ,a 或field。<fieldname>``DateTimeField``ForeignKey``OneToOneField``ManyToManyField
  • admin.E029:值必须是列表或元组。prepopulated_fields[<field name>]
  • admin.E030prepopulated_fields引用 的值,不是属性。<field name>``<model>
  • admin.E031:值ordering必须是列表或元组。
  • admin.E032:值ordering具有随机排序标记 ?,但也包含其他字段。
  • admin.E033ordering引用的值,不是属性。<field name>``<model>
  • admin.E034:值readonly_fields必须是列表或元组。
  • admin.E035:值readonly_fields[n]不是可调用的,属性或属性。<ModelAdmin class>``<model>
  • admin.E036:值autocomplete_fields必须是列表或元组。
  • admin.E037autocomplete_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:值必须是a 。<InlineModelAdmin class>.model``Model
  • admin.E107:值list_display必须是列表或元组。
  • admin.E108list_display[n]引用的值,<label>不是可调用的,属性或属性或方法。<ModelAdmin class>``<model>
  • admin.E109:值list_display[n]不能是 ManyToManyField字段。
  • admin.E110:值list_display_links必须是列表,元组或None
  • admin.E111list_display_links[n]引用的值,<label>未定义list_display
  • admin.E112:值list_filter必须是列表或元组。
  • admin.E113list_filter[n]必须继承 的值ListFilter
  • admin.E114:值list_filter[n]不能继承自 FieldListFilter
  • admin.E115list_filter[n][1]必须继承 的值FieldListFilter
  • admin.E116list_filter[n]引用的值,<label>不引用Field。
  • admin.E117:值list_select_related必须是布尔值,元组或列表。
  • admin.E118:值list_per_page必须是整数。
  • admin.E119:值list_max_show_all必须是整数。
  • admin.E120:值list_editable必须是列表或元组。
  • admin.E121list_editable[n]引用的值,<label>不是属性<model>
  • admin.E122list_editable[n]引用的值,<label>不包含在中list_display
  • admin.E123:值list_editable[n]不能同时在 list_editablelist_display_links
  • admin.E124:值是list_editable[n]list_display<label>)中的第一个字段,除非list_display_links设置,否则不能使用 。
  • admin.E125list_editable[n]引用的值,通过管理员无法编辑。<field name>
  • admin.E126:值search_fields必须是列表或元组。
  • admin.E127date_hierarchy引用的值,不引用Field。<field name>
  • admin.E128:值date_hierarchy必须是DateFieldDateTimeField
  • admin.E129<modeladmin>必须has_<foo>_permission()<action>操作定义一个方法。
  • admin.E130__name__定义的操作属性 <modeladmin>必须是唯一的。

InlineModelAdmin

InlineModelAdmin对在a上注册为内联的任何内容执行以下检查 ModelAdmin

  • admin.E201:无法排除该字段,因为它是父模型的外键。<field name>``<app_label>.<model>
  • admin.E202<model>还没有ForeignKey到./ 有不止一个到。<parent model>``<model>``ForeignKey``<parent model>
  • admin.E203:值extra必须是整数。
  • admin.E204:值max_num必须是整数。
  • admin.E205:值min_num必须是整数。
  • admin.E206formset必须继承 的值BaseModelFormSet

GenericInlineModelAdmin

GenericInlineModelAdmin对在a上注册为内联的任何内容执行以下检查 ModelAdmin

  • admin.E301'ct_field'引用<label>,不是字段<model>
  • admin.E302'ct_fk_field'引用<label>,不是字段<model>
  • admin.E303<model>没有GenericForeignKey
  • admin.E304<model>没有GenericForeignKey使用内容类型字段和对象ID字段。<field name>``<field name>

AdminSite

对默认值执行以下检查 AdminSite

auth

  • auth.E001REQUIRED_FIELDS必须是列表或元组。
  • auth.E002USERNAME_FIELD不得包含名为自定义用户模型的字段REQUIRED_FIELDS
  • auth.E003<field>必须是唯一的,因为它被命名为 USERNAME_FIELD
  • auth.W004<field>被命名为USERNAME_FIELD,但它不是唯一的。
  • auth.E005:权限代号<codename>冲突,内置模型权限<model>
  • auth.E006:代号的权限<codename>与模型重复 <model>
  • auth.E007verbose_name模型<model>的内置权限名称最多为244个字符,最多为244个字符。
  • auth.E008:名为<name>model 的权限<model>超过255个字符。
  • auth.C009:必须是属性或属性而不是方法。忽略这是一个安全问题,因为匿名用户将被视为已通过身份验证!<Usermodel>.is_anonymous
  • auth.C010:必须是属性或属性而不是方法。忽略这是一个安全问题,因为匿名用户将被视为已通过身份验证!<Usermodel>.is_authenticated

contenttypes

当模型包含a GenericForeignKey或 时,执行以下检查 GenericRelation

  • contenttypes.E001GenericForeignKey对象ID引用不存在的字段<field>
  • contenttypes.E002GenericForeignKey内容类型引用不存在的字段<field>
  • contenttypes.E003<field>不是ForeignKey
  • contenttypes.E004<field>是不是ForeignKeycontenttypes.ContentType
  • contenttypes.E005:模型名称最多为100个字符。

postgres

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

  • postgres.E001:数组的基本字段有错误:…
  • postgres.E002:数组的基本字段不能是相关字段。
  • postgres.E003<field>default应该是可调用的而不是实例,因此它不会在所有字段实例之间共享。

sites

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

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

staticfiles

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