Форум
подписаться на последние сообщения:

Зависимые формы.

I159
#
Поставил задачу, казавшуюся не сложной, а оказалось, что для меня это совсем не просто. Делаю три зависимых формы. По задумке, каждая следующая форма отфильтровывает данные в соответствии со значением переданным из предыдущей. При отправке последней формы, произвести запись в бд.
Формы:

class MakeOfCar(forms.Form):
	make = forms.ModelChoiceField(label = 'Make of your car', empty_label = None, queryset = Make.objects.all(),)


class ModelFromMake(forms.Form):
	make = forms.CharField(widget = forms.HiddenInput)
	def __init__(self, make, *args, **kwargs):
		super(ModelFromMake, self).__init__(*args, **kwargs)
		self.fields['make'] = make
	car_model = forms.ModelChoiceField(label = 'Model of your car:', queryset = CarModel.objects.none(), empty_label = None, required= False)
	def __init__(self, make, *args, **kwargs):
		super(ModelFromMake, self).__init__(*args, **kwargs)
		self.fields['car_model'].queryset = CarModel.objects.filter(make = make)
		
class CarModelDetail(forms.Form):
	make = forms.CharField(widget = forms.HiddenInput)
	car_model = forms.CharField(widget = forms.HiddenInput)
	def __init__(self, make, car_model, *args, **kwargs):
		super(CarModelDetail, self).__init__(*args, **kwargs)
		self.fields['make'] = make
		self.fields['car_model'] = car_model
	body_type = forms.ModelChoiceField(queryset = Body.objects.none(), empty_label = None, required = False)
	engine_type = forms.ModelChoiceField(queryset = Engine.objects.none(), empty_label = None, required = False)
	gear_box_type = forms.ModelChoiceField(queryset = Transmission.objects.none(), empty_label = None, required = False)
	year = forms.ModelChoiceField(queryset = Year.objects.none(), empty_label = None, required = False)
	def	__init__(self, car_model, *args, **kwargs):
		super(CarModelDetail, self).__init__(*args, **kwargs)
		self.fields['body_type'].queryset = Body.objects.filter(carmodel = car_model)
		self.fields['engine_type'].queryset = Engine.objects.filter(carmodel = car_model)
		self.fields['gear_box_type'].queryset = Transmission.objects.filter(carmodel = car_model)
		self.fields['year'].queryset = Year.objects.filter(carmodel = car_model)
	
class AddlCarDetail(ModelForm):
	class Meta:
		model = Car
		fields = ('color', 'mileage', 'img1', 'img2', 'img3', 'img4', 'img5')

Вьюха (запись в бд ещё не писал):

def car_sale(request):
	if request.method == 'POST':
		if request.POST.get('make'):
			make = request.POST.get('make')
			form = ModelFromMake(make, request.POST)
			return render_to_response('car_sale.html', {'form': form, 'make': make})# 'car_model': car_model, 'model': model, 'form_request': form_request,})
		if request.POST.get('car_model'):
			car_model = request.POST.get('car_model')
			form = CarModelDetail(car_model, request.POST)
			addl_form = AddlCarDetail()
			return render_to_response('car_sale.html', {'form': form, 'addl_form': addl_form, 'car_model': car_model})
	form = MakeOfCar()
	return render_to_response('car_sale.html', {'form': form,})

Проблема: при передаче второй формы, содержащей скрытое поле, перехода к третьей форме не происходит.
Вопрос: каким образом передать скрытое поле в следующую форму? В чем состоит ошибка?

Пробовал решить данную задачу при помощи FormWizard, однако в FormWizard не нашел средств передачи данных из формы в форму. Если вопрос поставлен не корректно или задача решается не соответствующими методами, буду благодарен за рекомендации. Так же, если Вам очевидно, что причина допущенной ошибки -незнание базового раздела документации Django или Python, буду очень благодарен за соответствующую ссылку.
Share
Сообщение отредактировано: 20 Февраль 2011, 13:09
I159
#
И второй вариант, с FormWizard:

class MakeOfCar(forms.Form):
	make = forms.ModelChoiceField(label = 'Make of your car', empty_label = None, queryset = Make.objects.all(),)


class ModelFromMake(forms.Form):
	car_model = forms.ModelChoiceField(label = 'Model of your car:', queryset = CarModel.objects.none(), empty_label = None, required= False)
	def __init__(self, make, *args, **kwargs):
		super(ModelFromMake, self).__init__(*args, **kwargs)
		self.fields['car_model'].queryset = CarModel.objects.filter(make = make)
		
class CarModelDetail(forms.Form):
	body_type = forms.ModelChoiceField(queryset = Body.objects.none(), empty_label = None, required = False)
	engine_type = forms.ModelChoiceField(queryset = Engine.objects.none(), empty_label = None, required = False)
	gear_box_type = forms.ModelChoiceField(queryset = Transmission.objects.none(), empty_label = None, required = False)
	year = forms.ModelChoiceField(queryset = Year.objects.none(), empty_label = None, required = False)
	def	__init__(self, car_model, *args, **kwargs):
		super(CarModelDetail, self).__init__(*args, **kwargs)
		self.fields['body_type'].queryset = Body.objects.filter(carmodel = car_model)
		self.fields['engine_type'].queryset = Engine.objects.filter(carmodel = car_model)
		self.fields['gear_box_type'].queryset = Transmission.objects.filter(carmodel = car_model)
		self.fields['year'].queryset = Year.objects.filter(carmodel = car_model)
	
class AddlCarDetail(ModelForm):
	class Meta:
		model = Car
		fields = ('color', 'mileage', 'img1', 'img2', 'img3', 'img4', 'img5')

class SellingWizard(FormWizard):
    def done(self, request, form_list):    
        wizard_forms = [form.cleaned_data for form in form_list]
        new_car = Car(make = wizard_forms.MakeOfCar['make'],
                      car_model = wizard_forms.ModelFromMake['car_model'],
                      body = wizard_forms.CarModelDetail['body_type'],
                      engine = wizard_forms.CarModelDetail['engine_type'],
                      transmission = wizard_forms.CarModelDetail['gear_box_type'],
                      year = wizard_forms.CarModelDetail['year'],
                      color = wizard_forms.AddlCarDetail['color'],
                      mileage = wizard_forms.AddlCarDetail['mileage'], 
                      price = wizard_forms.AddlCarDetail['price'], 
                      img1 = wizard_forms.AddlCarDetail['img1'], 
                      img2 = wizard_forms.AddlCarDetail['img2'], 
                      img3 = wizard_forms.AddlCarDetail['img3'], 
                      img4 = wizard_forms.AddlCarDetail['img4'], 
                      img5 = wizard_forms.AddlCarDetail['img5'] )
        new_car.save()
        return HttpResponseRedirect('/thanks_for_sale/')
        def process_step(self, request, form, step):
        	if step == 1:
        		make = form.cleaned_data['make']
        		self.form_list[1] = ModelFromMake(make, request.POST)
        	if step == 2:
        		car_model =  form.cleaned_data['car_model']
        		self.form_list[2] = CarModelDetail(car_model, request.POST)

C конструкторами еще разбираюсь, могу бредить.
Проблема: уже из первой во вторую форму не передается выбранное значение и select второй формы выводится пустым.
Вопрос: Где я ошибаюсь? Как в FormWizard передать от одной формы к другой выбранное значение?
Сообщение отредактировано: 21 Февраль 2011, 18:42
admin
#
Всегда можно попробовать записать значение первой формы в сессию и во второй форме достать значение. Может есть и более правильные способы, но что то в голову ничего не приходит.
I159
#
Направление ясно, спс.
I159
#
А что к стати с передачей значения внутри класса FormWizard? Возможно ли передать значение в методы форм, содержащиеся в form_list?
Код FormWizard сейчас выглядит так:

class SellingWizard(FormWizard):
    def done(self, request, form_list):    
        wizard_forms = [form.cleaned_data for form in form_list]
        new_car = Car(make = wizard_forms.MakeOfCar['make'],
                      car_model = wizard_forms.ModelFromMake['car_model'],
                      body = wizard_forms.CarModelDetail['body_type'],
                      engine = wizard_forms.CarModelDetail['engine_type'],
                      transmission = wizard_forms.CarModelDetail['gear_box_type'],
                      year = wizard_forms.CarModelDetail['year'],
                      color = wizard_forms.AddlCarDetail['color'],
                      mileage = wizard_forms.AddlCarDetail['mileage'], 
                      price = wizard_forms.AddlCarDetail['price'], 
                      img1 = wizard_forms.AddlCarDetail['img1'], 
                      img2 = wizard_forms.AddlCarDetail['img2'], 
                      img3 = wizard_forms.AddlCarDetail['img3'], 
                      img4 = wizard_forms.AddlCarDetail['img4'], 
                      img5 = wizard_forms.AddlCarDetail['img5'] )
        new_car.save()
        return HttpResponseRedirect('/thanks_for_sale/')
    def process_step(self, request, form, step):
        if step == 1:
            make = form.cleaned_data['make']
            self.form_list[1] = ModelFromMake(make, request.POST)
        if step == 2:
            car_model =  form.cleaned_data['car_model']
            self.form_list[2] = CarModelDetail(car_model, request.POST)