Django筛选多个URL参数

2024-10-06 12:11:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Django-filter应用程序在我的网站上构建搜索。这是代码:

class PropertyFilter(django_filters.FilterSet):
city = django_filters.ModelMultipleChoiceFilter(queryset=City.objects.all(), widget = CheckboxSelectMultiple)
trade_type = django_filters.ModelMultipleChoiceFilter(queryset=Trade.objects.all(), widget = CheckboxSelectMultiple)

class Meta:
    model = Property
    fields = ['city', 'trade_type']

问题是,当用户标记两个城市时,Django filter只通过最后一个URL参数过滤对象(这个casse中的第2个城市):

http://example.org/lt/list/city=1&city=2

Models.py

class City(models.Model):
    name = models.CharField(max_length=250, verbose_name=_('Name'))

也许我做错了什么?


Tags: djangocityobjectstypeallwidgetfilterfilters
2条回答

您可以创建多个版本的查询字符串,并接受列表作为筛选参数:

http://example.org/lt/list/?cities=1,2


class CustomFilterList(django_filters.Filter):
    def filter(self, qs, value):
        if value not in (None, ''):
            values = [v for v in value.split(',')]
            return qs.filter(**{'%s__%s' % (self.name, self.lookup_type): values})
        return qs

class PropertyFilter(django_filters.FilterSet):
    city = django_filters.ModelMultipleChoiceFilter(queryset=City.objects.all(), widget = CheckboxSelectMultiple)
    trade_type = django_filters.ModelMultipleChoiceFilter(queryset=Trade.objects.all(), widget = CheckboxSelectMultiple)
    cities = CustomFilterList(name="city", lookup_type="in")

    class Meta:
        model = Property
        fields = ['cities', 'city', 'trade_type']

检查此答案以正确筛选值列表:

Possible to do an `in` `lookup_type` through the django-filter URL parser?

你可以让它与你尝试的网址相同。以我为例。您必须通过要筛选的选项。

我正在调用的URL:

http://example.org/product-list/gender=1&gender=2

过滤器.py

GENDER_CHOICES = tuple(
    ProductAttributeOptions.objects.filter(group__name='gender').values_list('id', 'option'))

class ProductFilter(django_filters.FilterSet):        
    gender = django_filters.MultipleChoiceFilter(choices=GENDER_CHOICES,
                                                 method='filter_gender')

    def filter_gender(self, qs, name, value):
        result = qs.filter(Q(attribute_values__attribute__name='gender',
                         attribute_values__value_option__in=value))

        return result

class Meta:
    model = Product
    fields = ('gender')

希望这能有所帮助。我从official docs中得到灵感。

相关问题 更多 >