Django 在使用admin管理页面时报错 django.contrib.admin.exceptions.NotRegistered: The model XXXXX is not registered.
在admin.py的某个类中定义autocomplete_fields在使用admin管理页面时报错 django.contrib.admin.exceptions.NotRegistered: The model XXXXX is not registered.
首先检查admin.py中注册的顺序,
例如,在Book类中使用Author,
class AuthorAdmin(admin.ModelAdmin):
pass
class BookAdmin(admin.ModelAdmin):
autocomplete_fields = ["author"]
那么在admin.py中,AuthorAdmin必须在BookAdmin之前注册
另外,如果使用了自定义admin_site
# urls.py
urlpatterns = [
# path("admin/", admin.site.urls),
path("admin/", my_admin_site.urls),
]
# admin_site.py
class MyAdminSite(AdminSite):
"""
自定义管理站点类,继承自Django的AdminSite
用于自定义Django admin界面的显示和功能
"""
site_header = '我是site_header' # 管理站点的头部标题
site_title = '我是site_title' # 管理站点的标题
index_title = '我是index_title' # 管理站点首页的标题
def get_app_list(self, request, app_label=None):
"""
自定义应用列表,将app01的模型分组显示,同时保留Django内置应用
"""
app_dict = self._build_app_dict(request)
# 如果指定了app_label,返回父类的实现以保持兼容性
if app_label:
return super().get_app_list(request, app_label)
# app_test_models = {}
# for k, v in app_dict.items():
# app_test_models.update({model['object_name']: model for model in v['models']})
#
# # app_test_models = v.get('models', [])
# print('app_test_models:', app_test_models)
# 获取app01的所有模型
app_models = app_dict.get('app01', {}).get('models', [])
# 创建一个以模型对象名为键的映射字典
model_map = {model['object_name']: model for model in app_models}
# 自定义分组
grouped_apps = [
{
'name': '作者',
'app_label': 'author',
'models': [
model_map.get('Author'),
],
},
{
'name': '书籍',
'app_label': 'Book',
'models': [
model_map.get('Book'),
],
},
]
# 移除所有None值
for group in grouped_apps:
group['models'] = [model for model in group['models'] if model is not None]
# 移除空的分组
grouped_apps = [group for group in grouped_apps if group['models']]
# 添加Django内置应用(认证和授权等)
builtin_app_labels = ['auth', 'contenttypes', 'sessions', 'messages', 'admin']
for app_label in builtin_app_labels:
if app_label in app_dict:
app = app_dict[app_label]
# 确保app有必要的属性
if 'models' not in app:
app['models'] = []
grouped_apps.append(app)
return grouped_apps
# 实例化自定义 AdminSite
my_admin_site = MyAdminSite()
my_admin_site.register(Author, app01_admin.AuthorAdmin)
my_admin_site.register(Book, app01_admin.BookAdmin)
如果只在admin.py中注册了AuthorAdmin但是admin_site.py中没有注册AuthorAdmin,同样会报错 django.contrib.admin.exceptions.NotRegistered: The model Author is not registered.

浙公网安备 33010602011771号