2011-08-19 67 views
0

好吧,我有一个复杂的业务逻辑,有很多复杂的形式,因此我实际上是在飞行中生成字段当表单被创建时。我需要能够访问模板中的字段,但当然,因为它们已生成,所以我不能只是执行诸如{{ form.fieldname }}之类的操作,因为在这种情况下,fieldname实际上是由变量生成的。为django表单创建BoundFields的自定义列表/字典(模拟form.hidden_​​fields)

我试过的形式是这样的:

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只包含我的领域。

回答

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])