Связанные поля не фильтруются в наборе форм (при использовании библиотеки 'django-formset')
Я пытаюсь использовать библиотеку 'django-formset' для фильтрации выпадающего списка (объекты ForeignKey) при выборе элемента в связанном выпадающем списке (связанные объекты ForeignKey). Вроде бы все сделал по инструкции, но все равно данные во втором выпадающем списке не фильтруются. Может у кого-то есть опыт использования этой библиотеки с formset?
Что я сделал:
Модель
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',
)
Набор форм отображает уже существующие объекты, в которых необходимо сделать выбор из указанных полей
OrderCloseFormSet = modelformset_factory(
Order,
form=OrderCloseForm,
extra=0,
can_delete=False,
)
Шаблон
<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>
В вашей модели OrderCloseForm
параметр search_lookup
для поля type_car
установлен на использование 'name__icontains', но в вашей модели TypeCar
нет поля name
, вместо него есть поле title
name.
Исправьте его следующим образом:
widget=Selectize(
search_lookup='title__icontains', # Corrected from 'name__icontains'
placeholder="First, select Type car"
),
Проверьте, решит ли это вашу проблему.