24

私は Django を初めて使用し、そのリレーショナル モデルとインライン管理フォームに関するドキュメント ( InlineModelAdminのドキュメント) を読んだことがあります。 .

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

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

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

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


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

これは、Director オブジェクトの外部キーを想定しているため、エラーをスローします。カスタムフォーム、バリデーターなどを作成せずに達成しようとしていることは可能ですか? 正しい方向へのヒントは大歓迎です。事前に感謝します。

4

2 に答える 2

37

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

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

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

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

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

于 2012-06-12T14:46:04.717 に答える