手动Django表单显示

时间:2019-05-22 21:33:07

标签: django django-forms django-templates

我想在模板中手动呈现表单,但是我尝试的结果没有达到预期的结果,而且为什么也不清楚。

class MyForm(forms.Form):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['field1'] = forms.BooleanField()
        self.fields['field2'] = forms.BooleanField()
        systems = System.objects.all()
        for i in range(len(systems)):
            self.fields['s' + str(i)] = forms.BooleanField()
        self.fields['field3'] = forms.BooleanField()

        self.initial_fields = [self.fields['field1'], self.fields['field2']]

现在当我在模板中执行此操作时

{% for field in form.visible_fields %}
    {{ field }}
{% endfor %}

它返回您所期望的...在查找方法visible_fields之后,它仅返回字段列表。因此,从理论上讲,如果我像self.initial_fields一样创建自己的字段列表,则表单生成器应呈现与上面相同的内容:

{% for field in form.initial_fields %}
    {{ field }}
{% endfor %}

但是我却在模板中得到以下输出:

<django.forms.fields.BooleanField object at 0x000001242F51E588> 
<django.forms.fields.BooleanField object at 0x000001242F51E400>

我假设我缺少字段本身的一些初始化?我不明白为什么一个有效,而另一个无效。有人知道吗?

1 个答案:

答案 0 :(得分:1)

您需要获取绑定的字段对象,而不是字段本身。这样做并不是一种干净的方法,但是如果您想破解它,则应该这样做,

...
self.initial_fields = [self.fields['field1'].get_bound_field(self, 'field1'),
                       self.fields['field2'].get_bound_field(self, 'field2')]
...

希望这会有所帮助!