0

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:

  1. Select a certain country.
  2. Filter all regions within the selected country.
  3. 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:

enter image description here

This means that the forwarding in DAL works.

However, when I try DF together with DAL:

enter image description here

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:

enter image description here

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?

10
  • Can you share the HTML the Django filter generates as form? Commented Feb 17 at 20:20
  • Hello! The formatting is messed up when I paste the HTML in the post, so I uploaded a screen shot instead. Commented Feb 17 at 21:50
  • I am not really worried about the formatting, that can be fixed with a linter. But normally there should be a div.dal-forward-conf item in the HTML. Can you see if that is the case for DAL without DF, and perhaps where that is missing? Commented Feb 18 at 5:04
  • When I'm not using DF, I see this it in 3 elements: <div style="display:none" class="dal-forward-conf" id="dal-forward-conf-for_id_region"><script type="text/dal-forward-conf">[{"type": "field", "src": "country"}]</script></div> <div style="display:none" class="dal-forward-conf" id="dal-forward-conf-for_id_region"><script type="text/dal-forward-conf">[{"type": "field", "src": "country"}]</script></div> Commented Feb 18 at 7:01
  • <div style="display:none" class="dal-forward-conf" id="dal-forward-conf-for_id_city"><script type="text/dal-forward-conf">[{"type": "field", "src": "region"}]</script></div> Any ideas? Commented Feb 18 at 7:01

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.