1

django アプリのカスタム管理サイトを追加するときに、モデルと管理機能の両方を追加する必要がある理由を理解しようとしています。というアプリケーションがあるとします。Storyしたがって、管理サイトは と呼ばれStoryAdminます。これを django 管理インターフェースに登録するときは、次の行を追加する必要があります。

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

私の質問は、これを行う方法はありますか?

admin.site.register(StoryAdmin)

2 つではなく 1 つだけ追加すると、作業が単純になり、エラーが発生する可能性が低くなり、コードが冗長に見えなくなるためです。最終的に、すべての管理パネルのクリーンなリストを作成できるため、見栄えが良くなります。

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

2 に答える 2

1

それは良い質問です。そのように設計されている可能性がありますが、そうではありません。

主な理由は、管理者クラスをオプションにして、単純なケースではデフォルトの基本 ModelAdmin クラスを使用し、多くのモデルで同じ ModelAdmin サブクラスを使用できるようにするためだと思います。https ://github.com/django の実装を参照してください。 /django/blob/master/django/contrib/admin/sites.py#L52-101

また、ModelAdmin をカスタマイズする必要がある場合は、クラスを自分で定義する必要はありません。レジスタ関数に kwargs を渡すだけです。

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

それが私の賭けです。彼らは、モデルを登録するときにボイラープレートを最小限に抑え、より柔軟にできるようにしようとしています。

于 2013-04-06T18:44:57.163 に答える
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 を使用できます (これは、たとえば、同じ抽象モデルからモデルをサブクラス化する場合に望ましい場合があります)。

それはあなたのスタイルには合いませんが、それはあなたがただ受け入れてやり遂げなければならないものの1つにすぎません.

于 2013-04-06T18:41:52.867 に答える