2017-12-25 25 views
0

モデルがあります。以下は Djangoは外部キーによるモデルの動的選択を使用します

class MyModel(models.Model): 
    CHOICES = (
     (1, 'A1'), 
     (2, 'A2'), 
     (3, 'B1'), 
     (4, 'B2'), 
    ) 
    category = models.IntegerField(choices=CHOICES, default=3) 
    has_plan = models.ForeignKey(Plan, on_delete=models.CASCADE) 

は私の計画モデルである:この質問への懸念のためには、2つのフィールド1には、他のモデルプランへのForeignKeyであり、以下に示すように、他のがchoicefieldされる重要

class Plan(models.Model): 
    PLAN_CHOICES = [(1, "Individual"), (2, "Company")] 
    plan_name = models.IntegerField(choices=PLAN_CHOICES, default=2) 
    plan_validity = models.IntegerField(default=180, help_text="Days after plan expires") 

私はCHOICESを更新したいですhas_planの選択に応じて、MyModelcategoryフィールドで利用できるようになります。 has_planPlanを指している場合は、plan_nameのオブジェクトを考慮してください。私は両方ので、私はビューと管理のためにそれを処理する必要が

CHOICES = (
     (1, 'A1'), 
     (2, 'A2'), 
     (3, 'A3'), 
     (4, 'B1'), 
     (5, 'B2'), 
    ) 

私は、フォームフィールドの助けを借りて、ビューでこれを達成することができますが、その場合には:(2、以下「当社」)は、その後CHOICESに更新されるべきですこれを達成するためのより簡単でより簡単な方法を探しています。

モデルでclean()メソッドでエラーを発生させることができますが、例外を発生させる代わりにCHOICESを更新したいと思います。


更新:

最初のエントリの作成は私がマルチパートフォームを設定し、作成するためのソリューションを実現しますが、編集のためにDjangoの管理、カスタムビューで、私が対処しなければならないと思われているが

両方とも別々に。 これを行うのではなく、私はそれを一度更新できるので、djangoの管理者ビューまたはカスタムビューの作成と編集のために、単一のメソッドをオーバーライドする必要があります。

+0

フロントエンドでhas_planを選択していますか?正しい場合は、jqueryまたはjavascriptを使用して選択ボックスのオプションを更新します。 –

+0

でも、私はdjangoのデフォルトの管理ビューでそれを処理することもできませんし、私もそれに取り組まなければならないので、何とか私が変更/更新できる場合は、ビューと管理の両方を処理する必要はありません別に – Gahan

+0

私の意見では、あなたはそれをすることはできません。しかし、私は確信していない、インターネットで検索します。 –

答えて

0

インタラクティブにする場合(つまり、ユーザーがUIでhas_planを変更した場合、カテゴリの選択肢が変更されます)、クライアントサイドのロジックを実装する必要があります。その場合は、モデルにcleanメソッドを追加して、categoryhas_planのペアの正しさを確認することをお勧めします。 cleanメソッドは、Django管理モデルフォームでも呼び出されます。

何らかの形でhas_planに固定値があり、別の解決策が必要な場合は、質問/コメントを更新してください。

関連する問題