django复选框选择多个:我的复选框未选中

django复选框选择多个:我的复选框未选中,django,checkbox,multiplechoicefield,Django,Checkbox,Multiplechoicefield,我有一个带有复选框的ManyToManyField。当我的布尔字段share_data等于1时,应选中复选框 代码如下: class Participant(models.Model): databases = models.ManyToManyField(Advertiser, null=True, blank=True, through='ShareDataToBrands') @property def share_to_brands_list(self):

我有一个带有复选框的
ManyToManyField
。当我的布尔字段
share_data
等于1时,应选中复选框

代码如下:

class Participant(models.Model):
    databases = models.ManyToManyField(Advertiser, null=True, blank=True, through='ShareDataToBrands')

    @property
    def share_to_brands_list(self):
        brands=[]
        for brand in ShareDataToBrands.objects.all():
            brands.append((brand.advertiser.id, brand.advertiser.brand_name, brand.share_data))
    return brands


class ShareDataToBrands(models.Model):
    participant = models.ForeignKey(Participant, blank=False, null=False)
    advertiser = models.ForeignKey(Advertiser, blank=False, null=False)
    share_data= models.BooleanField(default=True)

    def __str__(self):
        return self.participant, self.advertiser, self.share_data


class ShareDataToBrandsForm(forms.ModelForm):

    class Meta:
        model = models.Participant
        fields = ('databases', )

    databases=forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple)

    def __init__(self, *args, **kwargs):
        super(ShareDataToBrandsForm, self).__init__(*args, **kwargs)
        share_to_brands=self.instance.share_to_brands_list
        self.fields['databases'].choices=self.fields['databases'].choices=[(brand[0], brand[1]) for brand in share_to_brands]
        self.initial['databases']=[brand[2] for brand in share_to_brands]
        print(self.initial['databases'])
        for brand in self.instance.share_to_brands_list:
            print brand
输出:

[True, True, True]
(1L, u'my super brand', True)
(2L, u'new brand', True)
(3L, u'just my brand', True)

当前,仅选中第一个复选框,即使输出中应选中所有复选框。怎么了?

我认为在为
复选框SelectMultiple
小部件设置初始值时,您需要传递一个应该检查的值列表,而不是每个选项的布尔值列表。因此,执行
initial=[True,True,True]
不会让您选中复选框。您希望执行类似于
initial=[1,2,3]
的操作

在您的示例中,可以将相关行替换为:

self.initial['databases']=[brand[0] for brand in share_to_brands if brand[2]]
它可以工作kkkksssss:)。非常感谢你。