2011-01-13 4 views
3

ModelAdminクラスを使用してadminでDjangoモデルを公開しようとしています。 ModelAdminは、追加と変更に同じフォームを使用すると見なしているようです。私は、add_viewが必要なフィールドだけをリストアップした簡略化されたフォームを使用したいと思います。送信後、change_viewにリダイレクトされ、ModelFormのデフォルトフォームを使用してほぼすべてのフィールドをレンダリングします。DjangoのModelAdminで使用するカスタムフォームを定義するAdd View

これを行う最も簡単な方法は何ですか?私はコードを検査しましたが、明確な方法は見当たりません。 ModelAdminは、add_viewとchange_viewの両方で単一のself.form参照を参照する傾向があります。私はadd_view()をオーバーライドすることを考えていますが、私はすべてのコードを再実装したくありません。 get_form()をオーバーライドする方が効率的かもしれませんが、add_viewまたはchange_view中にget_form()が呼び出されているかどうかを検出する方法はありません。

答えて

7

get_form()は、change_viewの間に呼び出されたときにobjパラメータが渡されます。必要に応じて新しいフォーム/微調整パラメータを返すだけで済みます。例えば


class MyModelAdmin(admin.ModelAdmin): 
    def get_form(self, request, obj=None, **kwargs): 
     # hide every other field apart from url 
     # if we are adding 
     if obj is None: 
      kwargs['fields'] = ['url'] 
     return super(MyModelAdmin, self).get_form(request, obj, **kwargs) 

を追加する場合にのみ、「URL」フィールドを表示し、それ以外の他のすべてのフォームを強制します。

+0

これは一般的に正しいアイデアですが、これより多くをオーバーライドする必要があります。 django/contrib/auth/admin.pyのUserAdminクラスが良い例です。 – Cerin