Django“实例”表单字段不呈现

时间:2013-06-18 16:55:16

标签: python 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()收益率,但我无法通过检查该对象来解决这个问题。

1 个答案:

答案 0 :(得分:2)

Form.fields自己保存字段,你想要渲染的是可以直接从表单本身获得的BounFields,即:

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