2013-06-18 7 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 работает правильно.) Я просто получаю эти строки, напечатанные в HTML, на основе указанного num_emails.

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

Я также попытался yield ING 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

Смежные вопросы