ModelTomの複数のフォームフィールドにManyToManyFieldを分割する
-
19-08-2019 - |
質問
トーナメントと呼ばれる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)
なぜそれが機能しないのかわかりませんが、確認するためだけにテストします...
編集:テスト済みで動作します。
所属していません StackOverflow