Django - Как установить отношение ForeignKey в forms.ModelForm

Моя задача - реализовать форму, в которой выбор значения второго поля зависит от значения первого поля. (Например, если значение первого поля - Легковые автомобили, то во втором поле должен отображаться седан/SUV и т.д., если значение первого поля - Коммерческие автомобили, то во втором поле должен отображаться грузовик/автобус и т.д.)

Код models.py:

class TypeTransport(models.Model):
    transport_name = models.CharField(max_length=100, verbose_name='kind of transport')


class TypeBodyTransport(models.Model):
    transport = models.ForeignKey(TypeTransport, on_delete=models.CASCADE, blank=True, null=True,
                                  verbose_name='kind of transport')
    body_name = models.CharField(max_length=100, verbose_name='transport body type')


class Advertisement(models.Model):
    transport = models.ForeignKey(TypeTransport, on_delete=models.SET_NULL, blank=True, null=True,
                                  verbose_name='kind of transport')
    body = models.ForeignKey(TypeBodyTransport, on_delete=models.SET_NULL, blank=True, null=True,
                             verbose_name='transport body type ')

Код 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>.

Подскажите, пожалуйста, как реализовать нужную мне функцию?

пробовали ли вы:

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.id),
                                  to_field_name="body_name")
    class Meta:
        model = Advertisement
        fields = ('transport', 'body')

<<<Вместо

вместо transport = transport попробуйте transport = transport.id

Я решил эту проблему с помощью библиотеки django-smart-selects. Дополнительно могу сказать, что в формах необходимо убрать поле, которое ссылается на ModelChoiceField, так как оно мешает своему queryset параметру. Я еще новичок, поэтому не сразу догадался, что проблема в chained selects (отредактировал вопрос).

Вернуться на верх