2013-06-18 40 views
1

我試圖做一個動態窗體,將允許多個輸入並根據需要增加窗體的大小。Django的「實例」窗體字段不呈現

下面是我的表單的簡化版本。

class Email(django.forms.Form): 
    givenName = django.forms.CharField(label='First Name:', max_length=100, required=True) 

    def __init__(self, *args, **kwargs): 
    e = kwargs.pop('num_emails', 1) 
    super(Email, self).__init__(*args, **kwargs) 
    for i in xrange(e): 
     self.fields['email_%i' % i] = django.forms.EmailField(label='Email:', required=False) 

    def iter_email(self): 
    for k, v in sorted(self.fields.items()): 
     if k.startswith('email_'): 
     yield v 

然後,模板

<form input action="/email"method="post"> 
    {% csrf_token %} 
    <div class="editor-field">{{ form.givenName.label_tag }}{{ form.givenName }}</div> 
    {% for m in form.iter_email %} 
    <div class="editor-field">{{ m.label_tag }}{{ m }}</div> 
    {% endfor %} 
</form> 

當我瀏覽這個表格,電子郵件域無法正確顯示了。 (givenName字段正常工作。)我只是根據指定的num_emails獲取以HTML格式打印的這些字符串。

<django.forms.fields.EmailField object at 0x7f7d100ebcd0>

我也曾嘗試yield荷蘭國際集團v.widget,但只是顯示

<django.forms.widgets.TextInput object at 0x7f54e00f23d0>

我覺得我只是需要修改的iter_email()產量,但我無法弄清楚通過檢查該對象。

回答

2

Form.fields擁有你想要渲染什麼,你可以從窗體本身直接將BounFields領域本身,即:

def iter_email(self): 
    for k in sorted(self.fields.keys()): 
     if k.startswith('email_'): 
      yield self[k] 
+0

優秀。非常感謝你。 – fandingo