1

複数の入力を許可し、必要に応じてフォームのサイズを大きくする動的フォームを作成しようとしています。

これが私のフォームの簡略化されたバージョンです。

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 フィールドは適切に機能します。)指定された .xml に基づいて、これらの文字列を HTML に出力するだけですnum_emails

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

私もyieldingを試しv.widgetましたが、それはただのショーです

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

得られるものを変更する必要があるだけのように感じiter_email()ますが、そのオブジェクトを調べてもわかりませんでした。

4

1 に答える 1

2

Form.fieldsフィールド自体を保持します。レンダリングに必要なのは、フォーム自体から直接取得できる BounFields です。

def iter_email(self):
    for k in sorted(self.fields.keys()):
        if k.startswith('email_'):
            yield self[k]
于 2013-06-18T17:06:30.903 に答える