1

我试图理解为什么在为 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,
)
4

2 回答 2

1

这不是如何admin.site.register构建的。它需要一个模型,然后是可选的用于显示该模型的 ModelAdmin:

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(例如,当您从同一个抽象模型中继承模型时,这可能是可取的)。

它不适合你的风格,但它只是你必须接受并继续下去的事情之一。

于 2013-04-06T18:41:52.867 回答
1

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

我认为主要原因是允许 admin 类是可选的,并在简单的情况下使用默认的基本 ModelAdmin 类,并允许对许多模型使用相同的 ModelAdmin 子类,请参见实现:https ://github.com/django /django/blob/master/django/contrib/admin/sites.py#L52-101

另外,如果您需要自定义 ModelAdmin,则不需要自己定义类,只需将 kwargs 传递给 register 函数:

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

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

于 2013-04-06T18:44:57.163 回答