Django中为多对多关联的MultipleChoiceField设置默认全选
Django表单默认选中所有关联FlowCellLane复选框的解决方案
我懂你的困扰——想让表单里所有和当前FlowCell关联的FlowCellLane复选框默认选中,但常规设置initial的地方没法用self,确实有点卡手。不过其实有个很直接的解决办法,就在你已经写好的__init__方法里就能搞定。
你只需要在设置完lanes字段的choices之后,直接给这个字段的initial属性赋值就行,因为此时在__init__里已经能正常访问self.flowcell和处理好的选项了。
修改后的DemuxerForm代码如下:
class DemuxerForm(forms.ModelForm): class Meta: model = Demuxer exclude = ["owner", "pid", "flowcell"] lanes = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple) def __init__(self, *args, **kwargs): self.flowcell = kwargs.pop('flowcell') super().__init__(*args, **kwargs) # 生成并排序选项 lane_choices = sorted([(lane.pk, str(lane.lane_number)) for lane in self.flowcell.lanes.all()]) self.fields['lanes'].choices = lane_choices # 设置默认选中所有lane的主键 self.fields['lanes'].initial = [pk for pk, _ in lane_choices]
如果想更高效一点,也可以不用重复遍历数据,直接从FlowCell关联的Lane中提取主键:
self.fields['lanes'].initial = list(self.flowcell.lanes.values_list('pk', flat=True))
核心逻辑就是:在表单初始化的后期,我们已经拿到了当前FlowCell对应的所有Lane数据,这时候给lanes字段的initial赋值所有Lane的主键,就能让复选框默认全部选中了。
内容的提问来源于stack exchange,提问作者Niels
相关产品推荐
相关产品推荐

