将ManyToManyField拆分为ModelForm中的多个表单字段

时间:2009-03-17 14:52:54

标签: python django django-forms 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())

all()之后的方法来自子类QuerySet。当我在我的视图中保存表单时,我这样做:

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

无论如何,这一切都很好。在我加载现有帖子时,我无法弄清楚如何填写这些表单字段。也就是说,当我将instance = post传递给表单时。有什么想法吗?

2 个答案:

答案 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)

我不明白为什么那不起作用,但我会测试它只是为了确保......

编辑:经过测试,确实有效。

答案 1 :(得分:1)

Paolo Bergantino走在正确的轨道上,并帮助我找到了它。这是解决方案:

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()]
相关问题