簡體   English   中英

為什么需要在Django admin中同時注冊應用名稱和應用管理員名稱?

[英]Why does one need to register both app name and app admin name in 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,
)

那不是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(例如,當您從同一抽象模型繼承一個模型時,這可能是理想的)。

它不適合您的風格,但這只是您必須接受並繼續進行的事情之一。

這是一個很好的問題,它本來可以這樣設計,但事實並非如此。

我認為主要原因是允許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'])

因此,我敢打賭,他們在注冊模型時會盡量減少樣板,並使其更加靈活。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM