Related fields aren't filtering in the formset (using library 'django-formset' )

65 views Asked by At

I'm trying to use the library 'django-formset' to filter drop-down list (ForeignKey objects) when selecting an item in a linked drop-down list (related ForeignKey objects). I think, I did everything according to the instructions, but still the data in the second drop-down list is not filtered. Maybe someone has experience using this library with formset?

What I did:

Model

class TypeCar(models.Model):
    title = models.CharField(max_length=20)

class Car(models.Model):
    reg_mark = models.CharField(max_length=10)
    type_car = models.ForeignKey(
        'TypeCar',
        ...
    )

class Order(models.Model):
    car = models.ForeignKey(
        Car,
        ...
    )
    type_car = models.ForeignKey(
        TypeCar,
        ...
    )

Form (FormSet):

from formset.widgets import Selectize

class OrderCloseForm(forms.ModelForm):
    type_car = forms.ModelChoiceField(
        label="Type_car",
        queryset=TypeCar.objects.all(),
        widget=Selectize(
            search_lookup='name__icontains',
            placeholder="First, select Type car"
        ),
        required=False,
    )

    car = forms.ModelChoiceField(
        label="Car",
        queryset=Car.objects.all(),
        widget=Selectize(
            search_lookup=['title__icontains'],
            filter_by={'type_car': 'type_car__id'},
            placeholder="Then, select a Car"
        ),
        required=False,
    )

    class Meta:
        model = Order
        fields = (
            'type_car',
            'car',
        )

Formset displays already existing objects in which need to make a selection of the above fields

OrderCloseFormSet = modelformset_factory(
    Order,
    form=OrderCloseForm,
    extra=0,
    can_delete=False,
)

Template

<head>
  <link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}">
  <link href="{% static 'formset/css/bootstrap5-extra.css' %}" rel="stylesheet">
  <link href="{% static 'formset/css/collections.css' %}" rel="stylesheet">
  <script type="module" src="{% static 'formset/js/django-formset.js' %}"></script>
</head>

<django-formset endpoint="{{ request.path }}" csrf-token="{{ csrf_token }}">
  {{ formset.management_form }}
  {{ formset.non_form_errors.as_ul }}
    {% for form in formset %}
      {% for field in form %}
        {{ field }}
      {% endfor %}
    {% endfor %}
</django-formset>
1

There are 1 answers

1
Mohammad Golam Dostogir On

In your OrderCloseForm, the search_lookup parameter for the type_car field is set to use 'name__icontains', but your TypeCar model does not have a name field instead it has a title name field.

Correct it like this:

widget=Selectize(
    search_lookup='title__icontains',  # Corrected from 'name__icontains'
    placeholder="First, select Type car"
),

Check if this solve your issue.