Форум
подписаться на последние сообщения:
|
|
Поставил задачу, казавшуюся не сложной, а оказалось, что для меня это совсем не просто. Делаю три зависимых формы. По задумке, каждая следующая форма отфильтровывает данные в соответствии со значением переданным из предыдущей. При отправке последней формы, произвести запись в бд. Формы:
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, буду очень благодарен за соответствующую ссылку.
|
|
|
И второй вариант, с 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 передать от одной формы к другой выбранное значение?
|
|
|
Всегда можно попробовать записать значение первой формы в сессию и во второй форме достать значение. Может есть и более правильные способы, но что то в голову ничего не приходит.
|
|
|
А что к стати с передачей значения внутри класса 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)
|
|