2010-12-08 4 views
1

1つの管理ページに共存する必要があるいくつかの相互関連するモデルがあります。Django管理者インラインフォーム - 外部キークエリセットを値のセットに限定する

劇場の制作にはキャストメンバーがあり、キャストメンバーには特定の役割が割り当てられています。劇場の制作は、書かれたテキスト(演劇、順応など)に関連し、書かれたテキストは、そのテキストのすべての役割のリストを保持します。プロダクションを追加するときは、各キャストメンバをそれらのロールのいずれかに関連付ける必要があります。

モデル:生産、人、キャストメンバー、役割、WrittenText

関係:生産と人がキャストメンバーを通じてM2M関係を持って、「役割」フィールドを追加します。ここ

は、データモデルが機能している方法です - Roleオブジェクトへの外部キー。ロール自体には、WrittenTextオブジェクトへの外部キーがあります。

これは問題です。プロダクションの管理ページでは、TabularInlineを使用してCastMembersを追加しています。テーブルのCastMemberエントリは、 'ロール'フィールドを、Productionが参照するWrittenTextで指定されたロールに限定する必要があります。

私はモデルフォームをオーバーライドすることによって、問題への途中のソリューションを作った:

class CastMemberForm(ModelForm): 
    class Meta: 
     model = CastMember 

    def __init__(self, *args, **kwargs): 
     super(CastMemberForm, self).__init__(*args, **kwargs) 
     if 'instance' in kwargs: 
     self.fields['role'].queryset = Role.objects.filter(source_text=self.instance.production.source_text) 

しかし、あなたは、ドロップダウンから人を選択し保存し、役割を選択した場合のみ動作それ以外の場合は、すべてのロールのリストが表示されます。 kwargsで "if"インスタンスを取り出すと、私にDoesNotExistErrorが返されます。

これはちょうどクライアント側のJSのようなものがなければやってもあまりにも複雑すぎるのですか、それとも簡単な解決策がありますか?

+0

この問題の解決策を見つけましたか?/ –

答えて

0

Hereは、javascript/ajaxを介してチェーンされた選択ボックスの例です。基本的には同じ原則ですべきですが、1つの選択ボックスを更新しないようにjsを調整する必要がありますが、インライン管理者のすべてが...おそらくこれがあなたに小さなインスピレーションを与えます!

+0

ヒントはありがたいですが、条件付きで何もする必要はありません。インラインのフォームにはProductionのドロップダウンもなく、親オブジェクトに完全に基づいています。私はこれを使って作業しています:http://www.stereoplex.com/blog/filtering-dropdown-lists-in-the-django-adminしかしそれは私が以前持っていたものよりも私を得ることはありません。それに取り組んでいたら、うまくいけばすぐに回答を投稿することができます。 :) –

関連する問題