Пример динамической формы 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)
И показать поля используя ваши кнопки аналогично.