【问题标题】:Django admin exclude subclassDjango 管理员排除子类
【发布时间】:2015-12-26 15:58:57
【问题描述】:

我有几个模型看起来是这样的:

class Page(SomeBaseClass):
    # random fields


class Link(Page):
    # some other fields

在我的admin.py 中,我已经注册了这些课程:

admin.site.register(Page) # shows both Pages and Links
admin.site.register(Link) # shows only Links

此时,管理员中的“页面”选项卡同时显示PageLink,而“链接”选项卡仅显示Link。是否可以从“页面”选项卡中排除 Link 模型?

【问题讨论】:

    标签: python django django-admin


    【解决方案1】:

    您可以为模型管理员覆盖 get_queryset,并使用 isnull 过滤没有子对象的对象。

    class PageAdmin(admin.ModelAdmin):
        def get_queryset(self, request):
            qs = super(PageAdmin, self).get_queryset(request)
            return qs.filter(link__isnull=True)
    
    admin.site.register(Page, PageAdmin)
    

    【讨论】:

    • MyModelAdmin 来自哪里?应该是PageAdmin
    • 是的,应该是PageAdmin
    • 它现在可以工作了,但是我仍然在列表中同时获得链接和页面。也许link__isnull 什么都不匹配?
    • 也许我误解了你想要做什么。使用上面的代码,如果我转到/admin/myapp/page/,那么任何带有相关链接的页面都不会显示。
    • 没错,它是我正在使用的另一个模块,它弄乱了它。当我使用默认的 Django 管理员时,它工作正常。感谢您的帮助。