te')); return $arr; } /* 遍历用户所有主题 * @param $uid 用户ID * @param int $page 页数 * @param int $pagesize 每页记录条数 * @param bool $desc 排序方式 TRUE降序 FALSE升序 * @param string $key 返回的数组用那一列的值作为 key * @param array $col 查询哪些列 */ function thread_tid_find_by_uid($uid, $page = 1, $pagesize = 1000, $desc = TRUE, $key = 'tid', $col = array()) { if (empty($uid)) return array(); $orderby = TRUE == $desc ? -1 : 1; $arr = thread_tid__find($cond = array('uid' => $uid), array('tid' => $orderby), $page, $pagesize, $key, $col); return $arr; } // 遍历栏目下tid 支持数组 $fid = array(1,2,3) function thread_tid_find_by_fid($fid, $page = 1, $pagesize = 1000, $desc = TRUE) { if (empty($fid)) return array(); $orderby = TRUE == $desc ? -1 : 1; $arr = thread_tid__find($cond = array('fid' => $fid), array('tid' => $orderby), $page, $pagesize, 'tid', array('tid', 'verify_date')); return $arr; } function thread_tid_delete($tid) { if (empty($tid)) return FALSE; $r = thread_tid__delete(array('tid' => $tid)); return $r; } function thread_tid_count() { $n = thread_tid__count(); return $n; } // 统计用户主题数 大数量下严谨使用非主键统计 function thread_uid_count($uid) { $n = thread_tid__count(array('uid' => $uid)); return $n; } // 统计栏目主题数 大数量下严谨使用非主键统计 function thread_fid_count($fid) { $n = thread_tid__count(array('fid' => $fid)); return $n; } ?>python - How do I chain filters with django filter and django autocomplete light - Stack Overflow
最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

python - How do I chain filters with django filter and django autocomplete light - Stack Overflow

programmeradmin2浏览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:

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?

发布评论

评论列表(0)

  1. 暂无评论