Здраствуйте, на Django 1.8 я хочу реализовать приложение с формой, в зависимости от значения числового поля "Комнаты", я хочу чтобы появлялись поля "Количество взрослых" и "Количество детей", в зависимости от числового значения "Количество детей", я хочу чтобы появлялись поля "Возраст детей". Реализовываю я это так, forms.py:
class HotelForm(forms.Form):
rooms = forms.IntegerField(label=(u'Комнаты'), min_value=1)
class TouristsForm(forms.Form):
adult = forms.IntegerField(label=(u'Количество взрослых'), min_value=1, initial=1, widget = forms.HiddenInput)
children = forms.IntegerField(label=(u'Количество детей'), min_value=0, initial=0, required=False, widget = forms.HiddenInput)
class ChildrenAgeForm(forms.Form):
children_age = forms.IntegerField(label=(u'Возраст детей'), min_value=2, max_value=10, initial=2, required=False, widget = forms.HiddenInput)
Вот так я реализовал formset и валидацию в views.py:
def bookingForm(request):
TouristsFormSet = formset_factory(TouristsForm)
ChildrenAgeFormSet = formset_factory(ChildrenAgeForm)
if request.method == 'POST':
booking_form = HotelForm(request.POST, prefix='booking_form')
tourists_formset = TouristsFormSet(request.POST, prefix='tourists')
childrenage_formset = ChildrenAgeFormSet(request.POST, prefix='childrenage')
if booking_form.is_valid() and tourists_formset.is_valid() and childrenage_formset.is_valid():
rooms = booking_form.cleaned_data['rooms']
for i in range(0, tourists_formset.total_form_count()):
tourists_form = tourists_formset.forms[i]
tourists = tourists_form.cleaned_data
for n in range(0, childrenage_formset.total_form_count()):
childrenage_form = childrenage_formset.forms[n]
childrenage = childrenage_form.cleaned_data
Добавление формсетовских полей в html, я реализовал с помощью jquery, а html код выглядит вот так:
{{ tourists_formset.management_form }}
{{ childrenage_formset.management_form }}
jquery, на всякий случай:
$(function(){
$('#id_rooms').on('change', function(e){
var n = $('#id_rooms').val() || 0;
var html = "";
for (var i = 0; i < n; i++) {
html += "<div>Количество человек в комнате " + (i + 1) + "</div>"
+ "<br/><label for='id_form-" + i + "-adult'>Количество взрослых:</label>"
+ "<input id='id_form-" + i + "-adult' type='number' name='form-" + i + "-adult'/>"
+ "<label for='id_form-" + i + "-children'>Количество детей:</label>"
+ "<input id='id_form-" + i + "-children' type='number' name='form-" + i + "-children' class='children_age'/>"
+ "<div class='extrafieldWrapperChAge'></div>";
}
$(".extrafieldWrapper").html(html);
});
$(".extrafieldWrapper").on('change', '.children_age', function(e){
var n = $(this).val() || 0;
var html = "";
for (var i = 0; i < n; i++) {
html += "<br/><label for='id_form-" + i + "-childrenage'>Возраст ребенка "+(i+1)+"</label>"
+ "<input id='id_form-" + i + "-childrenage' type='number' name='form-" + i + "childrenage' />";
}
$(this).next('.extrafieldWrapperChAge').html(html);
});
});
При сабмите у меня возникает ошибка: [u'ManagementForm data is missing or has been tampered with']. Подскажите пожалуйста в чем может быть ошибка, может я не правильно реализовал задуманное. Заранее спасибо.