I am trying to combine Django Filters (DF) with Django Autocomplete Light (DAL). I also want to chain the filter on a few fields in my model.
For instance, before applying the DF to my model, I'd like to accomplish the following:
- Select a certain country.
- Filter all regions within the selected country.
- Filter all the cities within the selected region.
I have implemented DF and DAL separately and have no issues, which indicates that my views are working as intended. Therefor I don't see any point to share the URLs.
I can the see the following response in the console when manually testing DAL in another form:
This means that the forwarding in DAL works.
However, when I try DF together with DAL:
I see that the dictionary values are not set. Which is correct because in the drop-down form I don't see any filtering. I can only auto complete my search for the country field. The region and city fields are not working properly.
Views:
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 filter class:
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"]
The model I try to filter:
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)
The HTML created by DF:
The fields country, region and city have a ForeignKey relation to the models Country, Region and City which are models from django cities light.
Have anyone managed to accomplished what I have described or know any other method to auto complete a form field before applying a filter?