2015-11-10 3 views
0

Я хочу создать форму с полем «комнаты», это целое поле. В зависимости от количества комнат я хочу создать еще два поля для каждой комнаты «extra_adult» и «extra_children». И в зависимости от числа детей я хочу генерировать поля «children_age».Генерация полей динамической формы Django

Я новичок в Python и Django, и я пытался сделать, как на DYNAMIC FORM GENERATION пост и как here, но я застрял с несколькими вопрос:

1) У меня есть ошибка global name 'rooms' is not defined в forms.py;

2) как следует i до cleaned_data для extra_adult, extra_children, extra_children_age поля;

3) в зависимости от количества детей, как добавить поля extra_children_age.

Вот мой form.py

class RoomsForm(forms.Form): 
     rooms = forms.IntegerField(label=(min_value=1) 

     def __init__(self, *args, **kwargs): 
       extra_adult = kwargs.pop('extra_adult', 0) 
       extra_children = kwargs.pop('extra_children', 0) 
       super(HotelForm, self).__init__(*args, **kwargs) 
       for room in rooms: 
         self.fields['adult_%s' % room] = forms.IntegerField(min_value=1) 
         self.fields['children_%s' % room] = forms.IntegerField(label=(required=False) 

views.py

def bookingForm(request): 
     if request.method == 'POST': 
       form = HotelForm(request.POST, extra_a=request.POST.get('extra_adult'), extra_c=request.POST.get('extra_children')) 
       if form.is_valid(): 
         rooms = form.cleaned_data['rooms'] 
         print "form is valid" 
     else: 
       form = HotelForm() 

     return render(request, 'booking/booking.html', { 'form': form }) 

Спасибо за вашу помощь.

ответ

1

Ваш код требует много улучшений, я не мог бы написать все это для вас, но здесь есть некоторые места, кажется, не так очевидно:

  1. Ваше определение поля формы кажется странным: rooms = forms.IntegerField(label=(min_value=1), принять посмотрите на некоторые примеры, чтобы исправить это.

  2. Ваша первая ошибка в том, что у вас нет переменной rooms, определенной в вашем конструкторе. Кроме того, вы не можете просто получить значение из поля rooms, так что все поля формы заполняются и отправляются одновременно, нет возможности, чтобы поля могли пересекаться друг с другом. Вам может понадобиться отдельная форма, чтобы просто получить информацию о комнате.

  3. Вы пытаетесь сделать kwargs.pop(), но мы вернем вам дополнительную информацию. Для того, чтобы заставить его работать, вы должны сделать что-то вроде:

form = HotelForm(request.POST, extra_adult=1, extra_children=2)

На примере вы видите, немного неправильно ведущий, вы не должны кормить этих параметров с request.POST.get данных, они должны быть поданы с некоторые другие источники, поэтому я предлагаю вам сделать информацию о комнате в другой форме. Как только у вас это получится, то результат подачи во вторую форму намного проще.

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