44
55import django .core .checks
66from django import forms
7+ from django .apps import apps
8+ from django .contrib .admin .sites import all_sites
79from django .db import models
810from django .db .models .options import DEFAULT_NAMES as META_ATTRS
911
@@ -62,10 +64,6 @@ def check_models(
6264 yield from check (field , field_ast = field_ast , model = model )
6365
6466
65- class MetaAttrsForm (BaseCheckForm ):
66- attrs = forms .MultipleChoiceField (choices = [(o , o ) for o in META_ATTRS ])
67-
68-
6967class CheckModel (BaseCheck ):
7068 @abstractmethod
7169 def apply (
@@ -102,6 +100,10 @@ def apply(
102100@registry .register (django .core .checks .Tags .models )
103101class CheckModelMetaAttribute (CheckModel ):
104102 Id = CheckId .X011
103+
104+ class MetaAttrsForm (BaseCheckForm ):
105+ attrs = forms .MultipleChoiceField (choices = [(o , o ) for o in META_ATTRS ])
106+
105107 settings_form_class = MetaAttrsForm
106108
107109 def __init__ (self , attrs : List [str ], ** kwargs : Any ) -> None :
@@ -122,3 +124,33 @@ def apply(
122124 hint = f'Set "{ attr } " attribute in Meta.' ,
123125 obj = model ,
124126 )
127+
128+
129+ @registry .register (django .core .checks .Tags .models )
130+ class CheckModelAdmin (CheckModel ):
131+ Id = CheckId .X012
132+
133+ class AdminForm (BaseCheckForm ):
134+ def clean (self ) -> dict :
135+ if not apps .is_installed ("django.contrib.admin" ):
136+ raise forms .ValidationError (
137+ "django.contrib.admin must be in INSTALLED_APPS."
138+ )
139+ return super ().clean ()
140+
141+ settings_form_class = AdminForm
142+
143+ def __init__ (self , ** kwargs : Any ) -> None :
144+ super ().__init__ (** kwargs )
145+ self .models_with_admin = set ()
146+ for admin_site in all_sites :
147+ for model_cls , admin_cls in admin_site ._registry .items ():
148+ self .models_with_admin .add (model_cls )
149+ for inline in admin_cls .inlines :
150+ self .models_with_admin .add (inline .model )
151+
152+ def apply (
153+ self , model : Type [models .Model ], model_ast : ModelAST
154+ ) -> Iterator [django .core .checks .CheckMessage ]:
155+ if model not in self .models_with_admin :
156+ yield self .message ("The model is not registered in admin." , obj = model )
0 commit comments