模型名称未出现在多选字段中

The name of the model does not appear in the multiple choice field

我正在尝试创建一个包含多选字段的表单。我有一个 SchoolClass 模型,我想在表单中 select 多个 类。我可以在表格中 select SchoolClasses 但它没有显示任何标签。我不知道如何将名称传递给选择字段。

表格如下:

class ExamForm(forms.Form):
def __init__(self, class_choices, teacher_choices,teacher, *args, **kwargs):
    super(ExamForm, self).__init__(*args, **kwargs)
    self.fields['classes'].choices=SchoolClass.objects.filter(school_id=teacher.school_id)

我正在获取 SchoolClass 对象以供选择

classes = forms.MultipleChoiceField(choices=(), widget = forms.CheckboxSelectMultiple,
label = "Classes for this exam.")

当我 运行 我的项目时,它显示如下:

Blank choice fields

choices 期望二元组的迭代,其中第一项是键,第二项是渲染值。

因此您可以通过以下方式实现:

def __init__(self, class_choices, teacher_choices,teacher, *args, **kwargs):
    super(ExamForm, self).__init__(*args, **kwargs)
    self.fields['classes'].choices = [
        <b>(s.pk, str(s))</b>
        for s in SchoolClass.objects.filter(school_id=teacher.school_id)
    ]

不过,使用 ModelMultipleChoiceField [Django-doc] 可能会更好,因为那样我们就可以简单地使用查询集,所以类似于:

class MyForm(forms.Form):
    classes = forms.<b>ModelMultipleChoiceField</b>(
        queryset=SchoolClass.objects.none(),
        widget = forms.CheckboxSelectMultiple,
        label = 'Classes for this exam.'
    )

    def __init__(self, class_choices, teacher_choices,teacher, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['classes']<b>.queryset = SchoolClass.objects.filter(school_id=teacher.school_id)</b>