Django UpdateView CheckboxSelectMultiple-如何在CheckboxSelectMultiple中加载对象的ManyToMany字段?

Django UpdateView CheckboxSelectMultiple-如何在CheckboxSelectMultiple中加载对象的ManyToMany字段?,django,Django,My UpdateView从模型表单中绘制,其中sport_prefs字段作为复选框SelectMultiple加载。表单正确加载并成功将数据提交到MemberRecord模型 我的问题在UpdateView中,即使sport_prefs字段显示为复选框,它也不会加载当前对象sport_prefs字段的数据。复选框加载为空,虽然我可以选择选项,它将正确更新和保存,但我无法加载首次创建或上次更新时的sport_prefs数据 models.py class SportOptions(models.

My UpdateView从模型表单中绘制,其中sport_prefs字段作为复选框SelectMultiple加载。表单正确加载并成功将数据提交到MemberRecord模型

我的问题在UpdateView中,即使sport_prefs字段显示为复选框,它也不会加载当前对象sport_prefs字段的数据。复选框加载为空,虽然我可以选择选项,它将正确更新和保存,但我无法加载首次创建或上次更新时的sport_prefs数据

models.py

class SportOptions(models.Model):
    sport_name = models.CharField(max_length=200)

class MemberRecord(models.Model):
    name = models.ForeignKey(ContactInfo, on_delete=models.PROTECT)
    age = models.IntegerField()
    join_date = models.DateField(default=timezone.now)
    sport_prefs = models.ManyToManyField(SportOptions)
    notes = models.TextField(blank=True)
    author = models.ForeignKey(User, on_delete=models.PROTECT)
forms.py

class createForm(ModelForm):
    sport_preference = forms.ModelMultipleChoiceField(
                queryset=SportOptions.objects.filter(),
                widget=forms.CheckboxSelectMultiple
            )

    class Meta:
        model = MemberRecord
        fields = [
            'name',
            'age',
            'join_date',
            'sport_preference',
            'notes'
        ]

我的猜测是,我创建了一个新的复选框SelectMultiple字段,并加载了正确的选项,因为我从SportOptions模型中绘制,而不是从特定对象的sport_prefs中绘制。当我将ModelForm“sport\u preference”更改回“sport\u prefs”时,这显示为真,因为它正确加载了数据,但没有作为复选框SelectMultiple加载。我猜如果我想将数据作为复选框加载,我需要通过sport_preference中的查询集过滤器传递对象id?如果是这样,我该怎么做?

该字段的名称是sport\u prefs,因此您应该使用该字段名称。如果要使用其他标签,可以指定:

字段名为sport_prefs,因此您应该使用该字段名。如果要使用其他标签,可以指定:


该字段的名称是sport_prefs,因此您应该使用该字段名称。@WillemVanOnsem谢谢您的回答!如何将字段显示为复选框SelectMultiple?EDIT-NVM我在另一篇帖子上看到了您的回复,谢谢!!该字段的名称是sport_prefs,因此您应该使用该字段名称。@WillemVanOnsem谢谢您的回答!如何将字段显示为复选框SelectMultiple?EDIT-NVM我在另一篇帖子上看到了您的回复,谢谢!!谢谢如何将sport_prefs字段显示为复选框SelectMultiple?因为默认的ManyToMany字段显示为multi-select,我更喜欢复选框@jonayoung:您保留了widget=forms.CheckboxSelectMultiple?@jonayoung:问题不在于widget,而在于您字段的名称没有映射到模型字段的名称上。很抱歉,我重新阅读了您的回答。我改变了你的解释,它起作用了。非常感谢你,威廉!!谢谢如何将sport_prefs字段显示为复选框SelectMultiple?因为默认的ManyToMany字段显示为multi-select,我更喜欢复选框@jonayoung:您保留了widget=forms.CheckboxSelectMultiple?@jonayoung:问题不在于widget,而在于您字段的名称没有映射到模型字段的名称上。很抱歉,我重新阅读了您的回答。我改变了你的解释,它起作用了。非常感谢你,威廉!!
class createForm(ModelForm):
    sport_prefs = forms.ModelMultipleChoiceField(
        label='Sport preferences',
        queryset=SportOptions.objects.all(),
        widget=forms.CheckboxSelectMultiple()
    )

    class Meta:
        model = MemberRecord
        fields = [
            'name',
            'age',
            'join_date',
            'sport_prefs',
            'notes'
        ]