为什么需要在Django管理员中注册应用程序名称和应用程序管理员名称?

时间:2013-04-06 18:30:08

标签: python django django-admin

我想了解为什么在为django应用程序添加自定义管理站点时,需要添加模型和管理功能。比如,您有一个名为Story的应用程序,因此管理站点将被称为StoryAdmin。在django管理界面上注册时,您需要添加以下行:

# Registering all the changes to admin.site
admin.site.register(Story, StoryAdmin)

我的问题是,有没有办法做到这一点:

admin.site.register(StoryAdmin)

只添加一个而不是两个,因为这会使事情变得更简单,并且错误发生的可能性更小,而且代码看起来不那么冗余。它会使事情看起来更好,因为最后,你可以拥有一个干净的所有管理面板列表:

admin.site.register(
    StoryAdmin,
    SomeAdmin,
    FooAdmin,
)

2 个答案:

答案 0 :(得分:1)

That's not how admin.site.register is built。它需要一个Model,然后可选择使用ModelAdmin来显示该Model:

def register(self, model_or_iterable, admin_class=None, **options):
    """
    Registers the given model(s) with the given admin class.

    The model(s) should be Model classes, not instances.

    If an admin class isn't given, it will use ModelAdmin (the default
    admin options). If keyword arguments are given -- e.g., list_display --
    they'll be applied as options to the admin class.

    If a model is already registered, this will raise AlreadyRegistered.

    If a model is abstract, this will raise ImproperlyConfigured.
    """

这允许您在多个模型上使用相同的ModelAdmin(例如,当您将模型从同一个抽象模型子类化时,这可能是合乎需要的。)

它不适合您的风格,但它只是您必须接受并继续使用的其中一项。

答案 1 :(得分:1)

这是一个很好的问题,它本来可以这样设计,但事实并非如此。

我认为主要原因是允许管理类是可选的,并且对于简单的情况使用默认的基础ModelAdmin类,并且允许使用与许多模型相同的ModelAdmin子类< / strong>,请参阅:https://github.com/django/django/blob/master/django/contrib/admin/sites.py#L52-101

的实施

如果您需要自定义ModelAdmin,也不需要自己定义类,只需将kwargs传递给寄存器函数:

admin.site.register(Story, list_display=['field1', 'field2'])

所以这是我的赌注,他们在注册模型时尽量减少样板,并让它更灵活。