Пример динамической формы Django

У меня есть простое требование для создания динамической формы в Django - я видел много примеров, но они кажутся неполными или требуют более обширных знаний Python и Django, чем у меня! Никто не показывает, как динамическая часть примера должна называться:

это класс формы с Q1 и Q2-я помещаю кнопку в форму, чтобы добавить другую поле называется Q3 - а затем Q4, если снова нажать: я думаю, что получил init функция semi правильно:

class testform(forms.Form):
    Q1 = forms.CharField()
    Q2 = forms.CharField()

    def __init__(self, *args, **kwargs):
        super(testform,self).__init__(*args,**kwargs)
        self.fields['Q%s'%i] = forms.CharField(label='Q%i' % i)

Я хочу поместить кнопку в форму, чтобы добавить другую поле вызывается Q3, а затем Q4 при повторном нажатии.

  • как мне назвать _init_function с тем чтобы добавить эти поля?
  • если я использую Javascript для динамического добавления поля, как мне вызвать init так что я могу правильно проверить с Django, когда я публикую форму?

2 ответов


отвечая на ваш вопрос: при инициализации формы, он называет init(). Ex:form = testform(). Это инициализирует вашу форму. Я бы добавил javascript для создания этих новых полей. Я не уверен, насколько вы знакомы с javascript, но я собираюсь предположить, что вы можете разобраться в этом самостоятельно.

что касается проверки, это можно сделать в форме. Во-первых, вы хотите сказать, что вы добавили больше полей, используя init().

class TestCharField(forms.CharField):
    def __init__(self, *args, **kwargs):
        super(TestCharField, self).__init__(*args, **kwargs) # Needs * and **
    def clean(self, value):
        super(TestCharField, self).clean(value)
        # Do custom validation in here
        return value

class testform(forms.Form):
    def __init__(self, *args, **kwargs):
        super(testform, self).__init__(args, kwargs)

        # args should be a list with the single QueryDict (GET or POST dict)
        # that you passed it
        for k,v in args[0].items():
            if k.startswith('Q') and k not in self.fields.keys():
                self.fields[k] = TestCharField(initial=v, required=True)

вы можете назвать свое поле как угодно, оно не обязательно должно быть TestCharField. Просто не забудьте переименовать его в обоих местах. Это позволит вам сделать столько полей, сколько вам нравится. Дай мне знать, если это не сработает.


[редактирование] Это был не лучший ответ, Ответ Брайса намного лучше. Я принял вопрос буквально и дал решение для 4 полей, где действительно динамическая форма была бы гораздо более элегантным решением.

пожалуйста, взгляните на ответ Брайса.


Я думаю, что я бы определил форму со всеми возможными полями и скрыл / показал их с помощью javascript:

class testform(forms.Form)
    Q1 = forms.CharField()
    Q2 = forms.CharField()
    Q3 = forms.CharField()
    Q4 = forms.CharField()

HTML-код:

<table>
  {{ testform.as_table }}
</table>
...
<script type="text/javascript">
    $(function(){
        $('input[name="q3"]').closest('tr').hide();
        $('input[name="q4"]').closest('tr').hide();
    });
</script>

(используя JQuery)
И показать поля используя ваши кнопки аналогично.