Объединяющий фильтр с помощью django filter и django autocomplete light

Я пытаюсь объединить фильтры Django (DF) с Django Autocomplete Light (DAL). Я также хочу привязать фильтр к нескольким полям в моей модели.

Например, прежде чем применить DF к моей модели, я хотел бы выполнить следующее:

  1. Выберите определенную страну.
  2. Отфильтруйте все регионы в пределах выбранной страны.
  3. Отфильтруйте все города в пределах выбранного региона.

Я реализовал DF и DAL отдельно, и у меня нет проблем, что указывает на то, что мои представления работают должным образом. Поэтому я не вижу смысла делиться URL-адресами.

Я вижу следующий ответ в консоли при ручном тестировании DAL в другой форме:

enter image description here

Это означает, что переадресация inDAL работает.

Однако, когда я пробую DF вместе с DAL:

enter image description here

Я вижу, что значения словаря не заданы. Это правильно, потому что в раскрывающейся форме я не вижу никакой фильтрации. Я могу только автоматически завершить поиск по полю "страна". Поля "Регион" и "город" работают неправильно.

Просмотров:

class CountryAutoComplete(autocomplete.Select2QuerySetView):
    def get_queryset(self):
        qs = Country.objects.all()
        
        if self.q:
            qs = qs.filter(name__istartswith=self.q)
        
        return qs

class RegionAutoComplete(autocomplete.Select2QuerySetView):
    def get_queryset(self):
        qs = Region.objects.all()
        country = self.forwarded.get("country", None)
        
        if country:
            qs = qs.filter(country=country)
        
        if self.q:
            qs = qs.filter(name__istartwith=self.q)
        
        return qs

class CityAutoComplete(autocomplete.Select2QuerySetView):
    def get_queryset(self):
        qs = City.objects.all()  # Base queryset for cities
        region = self.forwarded.get("region", None)  # Get 'region' value from forwarded data
        
        if region:
            qs = qs.filter(region=region)  # Correctly filter cities by region
        
        if self.q:  # Filter cities based on the search query (q)
            qs = qs.filter(name__istartswith=self.q)
        
        return qs

Класс фильтра Django:

class RoomFilter(FilterSet):
    
    country = ModelChoiceFilter(lookup_expr="iexact",
                                queryset=Country.objects.all(), 
                                widget=autocomplete.ModelSelect2(url="auth_app:country-autocomplete"),
                                label=_("Land"))
    region = ModelChoiceFilter(lookup_expr="iexact", 
                               queryset=Region.objects.all(),
                               widget=autocomplete.ModelSelect2(url="auth_app:region-autocomplete", forward=["country"]),
                               label=_("Län"))
    city = ModelChoiceFilter(lookup_expr="iexact", 
                             queryset=City.objects.all(), 
                             widget=autocomplete.ModelSelect2(url="auth_app:city-autocomplete", forward=["region"]),
                             label=_("Stad"))

class Meta():
        model = Room
        fields = ["country", "region", "city"]

Модель, которую я пытаюсь отфильтровать:

class Room(models.Model):
    member = models.ForeignKey(Member, on_delete=models.CASCADE, null=True, related_name="rooms")
    room_category = models.CharField(_("Kategori"), blank=False, choices=RoomCategory.choices(), max_length=100, default=RoomCategory.choices()[0][0])
    title = models.CharField(_("Rubrik"), max_length=settings.ROOM_TITLE_LENGTH, blank=False, validators=[text_validator])
    country = models.ForeignKey(Country, blank=False, max_length=128, on_delete=models.PROTECT)
    region = models.ForeignKey(Region, blank=False, max_length=128, on_delete=models.PROTECT)
    city = models.ForeignKey(City, blank=False, max_length=128, on_delete=models.PROTECT)
    description = models.TextField(_("Beskrivning"), blank=False, max_length=settings.ROOM_DESCRIPTION_LENGTH)

Поля country, region и city имеют отношение ForeignKey к моделям Country, Region и City, которые являются моделями из django cities light.

Кому-нибудь удалось выполнить то, что я описал, или известен какой-либо другой способ автозаполнения поля формы перед применением фильтра?

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