Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 13, 2011 15:55:00

I159
От:
Зарегистрирован: 2010-12-09
Сообщения: 85
Репутация: +  0  -
Профиль   Отправить e-mail  

forms, разработка зависимых форм.

Есть форма <select> сделанная через ModelChoiceField. Возможно ли, средствами Form или ModelForm, сделать следующий <select>, содержимое которого выбиралось бы из бд в соответствии со значением переданным из предыдущей формы?
Форма:

class MakeOfCar(forms.Form):
make = forms.ModelChoiceField(label = 'Make of your car', queryset = Make.objects.all(), empty_label = None)
Модель из которой выбрал значения для <select>:
class Make(models.Model):
make = models.CharField(max_length = 24, blank = False)
car_model = models.ManyToManyField(CarModel, blank = True)
def __unicode__(self):
return u'%s' % (self.make,)
Модель из которой хочу сделать следующую выборку:
class CarModel(models.Model):
car_model = models.CharField(max_length = 24)#соответствующее значение
body = models.ManyToManyField(Body)#значения, которые хочу вывести
engine = models.ManyToManyField(Engine)
transmission = models.ManyToManyField(Transmission)
year = models.ManyToManyField(Year)
def __unicode__(self):
return u'%s %s %s %s %s' % (self.car_model, self.body ,self.engine ,self.transmission , self.year)
Представление:
def selected_models(request):
if request.method == 'POST':
make = Make.objects.get(id = request.POST['make'])
car_model = make.car_model.all()
model = [models.car_model for models in car_model]'''значение по которому я хочу делать
следующую выборку. Сейчас просто выводится текстом.'''
return render_to_response('selected_models.html', {'make': make, 'car_model': car_model, 'model': model,})



Отредактировано (Фев. 13, 2011 15:58:57)

Офлайн

#2 Фев. 13, 2011 18:01:15

I159
От:
Зарегистрирован: 2010-12-09
Сообщения: 85
Репутация: +  0  -
Профиль   Отправить e-mail  

forms, разработка зависимых форм.

Уточню. Сделал форму:

make = Make.objects.get(id = '22')#создал параметр искусственно 
class ModelFromMake(forms.Form):
car_models = forms.ModelChoiceField(label = 'Model of your car:', queryset = make.car_model.all(), empty_label = None)
Вопрос в том, что не понятно как передать в форму параметр запроса, в данном случае id, определяемый в предыдущей форме?



Офлайн

#3 Фев. 13, 2011 20:40:06

crchemist
От:
Зарегистрирован: 2008-07-09
Сообщения: 379
Репутация: +  0  -
Профиль   Отправить e-mail  

forms, разработка зависимых форм.

FormWizard?



Офлайн

#4 Фев. 19, 2011 11:21:21

I159
От:
Зарегистрирован: 2010-12-09
Сообщения: 85
Репутация: +  0  -
Профиль   Отправить e-mail  

forms, разработка зависимых форм.

В зависимость форм и FormWizard внесена некоторая ясность. Однако не понятно, как теперь передать выбранное значение в следующую форму? На данный момент вторая форма выводится пустой.
forms.py

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


class ModelFromMake(forms.Form):
car_model = forms.ModelChoiceField(label = 'Model of your car:', queryset = CarModel.objects.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'] )

return HttpResponseRedirect('/thanks_for_sale/')
urls.py:
(r'^car_sale/$', forms.SellingWizard([MakeOfCar, ModelFromMake, CarModelDetail, AddlCarDetail])),
('^thanks_for_sale/$', direct_to_template, {'template':'thanks_for_sale.html'}),
Если есть более рациональные решения такой задачи или задача поставлена не корректно, буду очень благодарен за рекомендации.



Отредактировано (Фев. 19, 2011 11:22:33)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version