2

私は次のモデルを持っています:

class Computer(models.Model):
    ...

class Demo(models.Model):
    computers = models.ManyToManyField(Computer)
    ...

class Scenario(models.Model):
    demo = models.ForeignKey(Demo)
    ...

class Setting(models.Model):
    scenario = models.ForeignKey(Scenario)
    computer = models.ForeignKey(Computer)

基本的に、デモは複数のコンピューターを使用します。デモにも複数のシナリオがあります。各シナリオにはいくつかの設定があり、各設定でコンピューターが構成されます。

私の問題は、django管理サイトを使用してシナリオを追加しているときに、ユーザーがドロップダウンリストでデモを選択し、一部のコンピューターの設定を構成した後、設定のコンピューターが実際にデモに含まれていることを検証する必要があります。

私はdjangoのドキュメントやオンラインサイトに目を通し、考えられるすべてのことを試しましたが、それでもこの作業を行うことはできません。

シナリオフォームのcleaned_dataから「demo」オブジェクトを取得できたものの、フォームで送信された設定にアクセスできないようであるため、カスタムフォーム検証を使用できません。'clean'をオーバーライドしてモデルレベルの検証を行う場合、新しいシナリオではcomputer_setが空であるため、新しいシナリオを追加するときではなく、シナリオを変更したときにのみ機能します。

どんな助けでも大歓迎です。

4

1 に答える 1

2

カスタムフォームをあなたに追加するだけSettingInlineです(私はあなたの投稿からそれSettingが のインラインであると仮定していますScenario)。

フォーム検証を使用できないとのことですが、他のすべての設定にアクセスする必要がある理由はわかりません。他の設定(送信されたすべての設定を含む検証など)にアクセスしたい場合は、formsetそれ自体をオーバーライドします。

class SettingForm(forms.ModelForm):
    class Meta:
        model = Setting

    def clean_computer(self):
        computer = self.cleaned_data.get('computer')
        if not self.instance.scenario.demo.computers.filter(computer=computer).count():
            raise forms.ValidationError("Computer not in demo")
        return computer

class SettingInline(admin.TabularInline):
    model = Setting
    form = SettingForm
于 2012-10-16T04:39:20.143 に答える