web-dev-qa-db-ja.com

Django adminにインライン多対多オブジェクトを追加する

私はDjangoにかなり慣れておらず、そのリレーショナルモデルとインライン管理フォームに関するドキュメントを読んだことがあります( InlineModelAdminに関するドキュメント )私は以下は、箱から出してすぐに、または自分のフォームをロールする必要がある場合に可能です。

映画と監督の2つのオブジェクトがあるとしましょう。これは、モデル宣言で次のように定義されている多対多の関係です。

class Film(Model):
    director = ManyToManyField('Director')

ここで、Filmオブジェクトの詳細フォームで、インラインDirectorオブジェクトをaddしたいと思います(これらには、唯一のプロパティとして名前フィールドがあります)。既存のインスタンスを選択するだけでなく、新しいインスタンスをFilmオブジェクトの形式でインラインで作成できます。

class DirectorInline(admin.TabularInline):
    model = Director
    extra = 3


class FilmAdmin(admin.ModelAdmin):
    inlines = (
        DirectorInline,
        )

Directorオブジェクトに外部キーが必要なため、これはエラーをスローします。カスタムフォームやバリデーターなどを作成せずに、私が達成しようとしていることは可能ですか?事前のおかげで、正しい方向へのヒントをいただければ幸いです。

15
Eelke

AdminのMany-to-manyフィールドのデフォルトウィジェットまたは filter_vertical またはfilter_horizontalプロパティを使用すると、新しいアイテムを追加できます。ポップアップウィンドウを開いて新しいDirectorインスタンスを追加するために、フィールドの近くに緑色の「+」記号があります。

ただし、インラインスタイルの管理者が必要な場合は、 through-model を参照する必要があります。カスタムモデルを指定しない場合Djangoは、DirectorとFilmへの2つの外部キーを持つ単純なモデルを作成します。

だからあなたは次のようなインラインを作成しようとすることができます

class DirectorInline(admin.TabularInline):
    model = Film.director.through
    extra = 3

これによって例外が発生することはなく、インラインフォームが生成されますが、ドロップダウンリストからディレクターを選択する必要があります。カスタムフォームを使用してこれを上書きできると思います。

26
Igor

ManyToManyFieldの横に「+」ボタンを追加する最も簡単な方法は、両方のオブジェクトがadmin.pyファイルに登録されていることを確認することです。それ以外の場合、Djangoは2番目のタイプのオブジェクトのフォームを作成しません

admin.py

admin.site.register(Film)
admin.site.register(Director)
1
Justin