質問

トーナメントと呼ばれるManyToManyFieldを持つモデルがあります。 2つのトーナメントフィールドを持つ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())

all()の後のメソッドは、サブクラス化されたQuerySetからのものです。ビューでフォームを保存するとき、次のようにします。

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

とにかく、これはすべて正常に動作します。既存の投稿を読み込むときに、これらのフォームフィールドに入力する方法がわからないのです。つまり、instance = postをフォームに渡すときです。アイデアはありますか?

役に立ちましたか?

解決 2

パオロベルガンティーノは正しい道を歩んでいて、私を見つけるのを助けてくれました。これが解決策でした:

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()]

他のヒント

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)

なぜそれが機能しないのかわかりませんが、確認するためだけにテストします...

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top