Django ModelMultipleChoiceField复选框显示异常求助
问题:Django表单中ManyToMany字段无法显示为复选框
我的Django模型代码:
class ProjectMember(models.Model): member_name = models.CharField(max_length=100) member_uid = models.CharField(max_length=15) member_reviewer_uid = models.CharField(max_length=15) member_roles = models.ManyToManyField('ProjectRole', blank=False) member_discipline = models.ManyToManyField('ProjectDiscipline', blank=False)
class ProjectRole(models.Model): role_name = models.CharField(max_length=10, unique=True) def __str__(self): return self.role_name
对应的表单代码:
class ProjectMemberForm(forms.ModelForm): class Meta: model = ProjectMember fields = ( 'member_name', 'member_uid', 'member_reviewer_uid', 'member_roles' ) # member_roles = forms.ModelChoiceField( member_roles = forms.ModelMultipleChoiceField( queryset=ProjectRole.objects.all(), widget=forms.CheckboxSelectMultiple(attrs={'class': 'form-control'}), required=True, # empty_label=None, # Hide the empty label for the select multiple widget. ) widgets = { 'member_name': forms.TextInput(attrs={'class': 'form-control'}), 'member_uid': forms.TextInput(attrs={'class': 'form-control'}), 'member_reviewer_uid': forms.TextInput(attrs={'class': 'form-control'}), }
问题与需求:
我尝试过注释里的代码,但member_roles始终显示为列表框而非复选框,希望将其改为复选框形式以便勾选选项。另外说明:该服务是配置服务器,无需将数据存入数据库,最终输出为.xml文件。
解决方案:
问题核心是你把member_roles的自定义字段定义写在了Meta类内部,Django不会识别这个位置的配置,所以使用了默认的列表框widget。
修改后的表单代码:
class ProjectMemberForm(forms.ModelForm): # 将member_roles的定义移到Meta类外面 member_roles = forms.ModelMultipleChoiceField( queryset=ProjectRole.objects.all(), widget=forms.CheckboxSelectMultiple(attrs={'class': 'form-control'}), required=True, ) class Meta: model = ProjectMember fields = ( 'member_name', 'member_uid', 'member_reviewer_uid', 'member_roles' ) widgets = { 'member_name': forms.TextInput(attrs={'class': 'form-control'}), 'member_uid': forms.TextInput(attrs={'class': 'form-control'}), 'member_reviewer_uid': forms.TextInput(attrs={'class': 'form-control'}), }
关键说明:
- ModelForm的自定义字段必须直接定义在类的顶层,不能放在
Meta类中,否则自定义配置不生效。 CheckboxSelectMultiple是Django提供的多选项复选框widget,位置正确后就能正常渲染。- 你不需要存数据库的需求不影响表单的配置,提交后直接处理表单数据生成XML即可。
内容的提问来源于stack exchange,提问作者JohnyCapo
相关产品推荐
相关产品推荐

