为django表单创建BoundFields的自定义列表/字典(模拟form.hidden_​​fields)

时间:2011-08-19 17:50:47

标签: django django-templates django-forms

好吧,我有一个有点复杂的形式,有很多复杂的业务逻辑,因此我实际上是在创建表单时动态生成字段。我需要能够访问模板中的字段,但当然,因为它们是生成的,所以我不能只执行{{ form.fieldname }}之类的操作,因为在这种情况下fieldname实际上是由变量构成的。 / p>

我在表单中尝试过类似的内容:

def __init__(self, *args, **kwargs):
    # initialization code is here, so let's just skip that
    self.items = kwargs.pop("items", [])
    self.my_fields = []
    for item in self.items:
        self.fields['item_%d' % item.pk]=forms.CharField(required=True, label=item.name)
        self.my_fields.append(self.fields['item_%d' % item.pk])

但是,在模板中,当我尝试这个时:

{% for field in self.my_fields %}
    {{ field }}
{% endfor %}

我得到类似<django.forms.fields.CharField object at 0x2b08aeb45810>

的内容

有没有办法做到这一点,所以我可以获得实际渲染的字段?

更新

看起来渲染字段的类型为django.forms.forms.BoundField,并且在__getitem__对象上调用field时创建。基本上,我想我需要一些方法来创建一个行为类似于hidden_fields但仅包含我的字段的东西。

1 个答案:

答案 0 :(得分:0)

想出来。为了确保触发__getitem__,我需要设置如下字段:

def __init__(self, *args, **kwargs):
    # initialization code is here, so let's just skip that
    self.items = kwargs.pop("items", [])
    self.my_fields = []
    for item in self.items:
        self.fields['item_%d' % item.pk]=forms.CharField(required=True, label=item.name)
        self.my_fields.append(self['item_%d' % item.pk])