2009-03-17 5 views
1

したがって、トーナメントと呼ばれるManyToManyFieldを持つモデルがあります。私は2つのトーナメントフィールドを持つModelFormを持っています:ManyToManyFieldをModelFormの複数のフォームフィールドに分割する

pay_tourns = forms.ModelMultipleChoiceField(
         queryset=Tourn.objects.all().active().pay_tourns(), 
         widget=forms.CheckboxSelectMultiple()) 
rep_tourns = forms.ModelMultipleChoiceField(
         queryset=Tourn.objects.all().active().rep_tourns(), 
         widget=forms.CheckboxSelectMultiple()) 

すべての後のメソッドは、サブクラスのQuerySetからです。私の見解でフォームを保存するとき、私はそうする:

post.tournaments = (post_form.cleaned_data.get('pay_tourns') 
           + post_form.cleaned_data.get('rep_tourns')) 

とにかく、これはすべてうまくいきます。どのようにするかわからないのは、既存の投稿を読み込んでいるときにこれらのフォームフィールドを埋めることです。つまり、フォームにinstance = postを渡したときです。何か案は?

答えて

1

パオロ・ベルガントーノが正しい軌道に乗っていて、見つけやすくなりました。これは解決策でした:

def __init__(self, *args, **kwargs): 
    super(MyForm, self).__init__(*args, **kwargs) 

    instance = kwargs.get('instance') 
    if instance: 
     self.fields['pay_tourns'].initial = [ o.id for o in instance.tournaments.all().active().pay_tourns()] 
     self.fields['rep_tourns'].initial = [ o.id for o in instance.tournaments.all().active().rep_tourns()] 
+0

良い解決策、知っておいてよかった。 :) –

2

あなたはのModelFormにこのような何かを行うことができます:

def __init__(self, *args, **kwargs): 
    super(MyForm, self).__init__(*args, **kwargs) 

    instance = kwargs.get('instance') 
    if instance: 
     self.fields['pay_tourns'].queryset.filter(post=instance) 
     self.fields['rep_tourns'].queryset.filter(post=instance) 

をそれが動作しないでしょう、なぜ私は表示されませんが、私は念のためにそれをテストするつもりだ...

編集:テスト済みで動作します。

+0

それは動作しますが、私が必要とすることはしません。クエリーセットを制限するのではなく、投稿に関連付けられたクエリーをチェックする必要があります。これは、投稿に関連付けられたトーナメントだけがオプションであることを確認することです。 – defrex

+0

Oooo、ok。 1秒後... –

関連する問題