在循环中创建松脆的表单布局

Create crispy form layout in a loop

我有一个表单,我正在使用 GET 请求中的值来显示可在表单中使用的值。我正在尝试使用 crispy 表单为每个值显示下拉菜单,但我不知道如何定义 crispyform 布局:

class ReportSample(forms.Form):

    def __init__(self, *args, **kwargs):
        super(ReportSample, self).__init__(*args, **kwargs)

        sr_id = self.data.getlist('id')
        current_sr_id = sr_id[0]

        vasr_obj = VariantAnnotationSampleRun.objects.filter(
                        sample_run_id=SampleRun.objects.get(id=current_sr_id)
                    )

        for o in vasr_obj:

            self.fields[str(o.id)] = forms.ChoiceField(
                    choices=(
                        ('dont_report', '-',),
                        ('report', 'Report',),
                        ('to_confirm', 'To confirm',),
                    )
                )

        self.helper = FormHelper()

        self.helper.layout = Layout(
                Submit('submit', 'Submit', css_class='upload-btn'),
            )
        self.helper.form_method = 'POST'

如果我要在 HTML 中以不脆的形式呈现它:

{{form}} 

然后我在 vasr_obj 中得到每个值的下拉列表。我如何通过在我的布局中定义字段(分配给 str(o.id) 变量)来做到这一点:

我试过这方面的变体:

        self.helper = FormHelper()


        for o in vasr_obj:

            id_field = forms.ChoiceField(
                    choices=(
                        ('dont_report', '-',),
                        ('report', 'Report',),
                        ('to_confirm', 'To confirm',),
                    )
                )

            self.helper.layout = Layout(
                    Field(id_field, css_class='search-sample'),
                    Submit('submit', 'Submit', css_class='upload-btn'),
                   )

        self.helper.form_method = 'POST'

但是报错:

WARNING:root:Could not resolve form field '<django.forms.fields.ChoiceField object at 0x7fb1b32d26d8>'.

尝试生成 Field 对象列表并将其传递给 Layout:

def __init__(self, *args, **kwargs):
    super(ReportSample, self).__init__(*args, **kwargs)

    sr_id = self.data.getlist('id')
    current_sr_id = sr_id[0]

    vasr_obj = VariantAnnotationSampleRun.objects.filter(
        sample_run_id=SampleRun.objects.get(id=current_sr_id)
    )

    fields = []
    for o in vasr_obj:
        str_id = str(o.id)
        fields.append(Field(str_id, css_class='search-sample'))
        self.fields[str_id] = forms.ChoiceField(
            choices=(
                ('dont_report', '-',),
                ('report', 'Report',),
                ('to_confirm', 'To confirm',),
            )
        )

    self.helper = FormHelper()
    self.helper.layout = Layout(
        *fields,
        Submit('submit', 'Submit', css_class='upload-btn'),
    )

    self.helper.form_method = 'POST'