Django - Как реализовать связь ForeignKey в forms.ModelForm
Всем привет. Моя задача: реализовать форму в которой выбор значения второго поля зависит от значения первого поля. (Например, если в первом поле указано значение Легковой транспорт, то во втором поле должен появится выбор седан/универсал и т.д., если в первом поле указано Коммерческий транспорт, то во втором поле должны появится самосвал/кран/автобус и т.д.)
Код models.py
:
class TypeTransport(models.Model):
transport_name = models.CharField(max_length=100, verbose_name='Тип транспорта')
class TypeBodyTransport(models.Model):
transport = models.ForeignKey(TypeTransport, on_delete=models.CASCADE, blank=True, null=True,
verbose_name='Тип транспорта')
body_name = models.CharField(max_length=100, verbose_name='Тип кузова')
class Advertisement(models.Model):
transport = models.ForeignKey(TypeTransport, on_delete=models.SET_NULL, blank=True, null=True,
verbose_name='Тип транспорта')
body = models.ForeignKey(TypeBodyTransport, on_delete=models.SET_NULL, blank=True, null=True,
verbose_name='Тип кузова')
Код forms.py
:
class CreateAdvertisementForm(forms.ModelForm):
transport = forms.ModelChoiceField(queryset=TypeTransport.objects.all(), to_field_name="transport_name")
body = forms.ModelChoiceField(queryset=TypeBodyTransport.objects.filter(transport=transport),
to_field_name="body_name")
class Meta:
model = Advertisement
fields = ('transport', 'body')
Думал что получится указать зависимость с помощью filter(transport=transport)
, но возвращается такая ошибка: TypeError: Field 'id' expected a number but got <django.forms.models.ModelChoiceField object at 0x7f40d7af5ac0>.
Подскажите пожалуйста, как правильно реализовать нужную мне фичу?
Оказалось все намного проще, все это решается с помощью библиотеки django-smart-selects. Из дополнительного могу сказать что в формах надо убрать поле с указанием на ModelChoiceField
, потому что оно мешает своим параметром queryset
. Я поскольку еще новичок, не сразу догадался что проблема в зависимых select-ах (Вопрос отредактировал).