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.

posted @ 2025-12-16 22:15  笑而不语心自闲  阅读(6)  评论(0)    收藏  举报