【问题标题】:How to create MultipleChoiceField in django-filter?如何在 django-filter 中创建 MultipleChoiceField?
【发布时间】:2021-07-16 17:32:58
【问题描述】:

我有一个模型颜色:

class Color(models.Model):
    color = models.CharField(max_length=32)

    def __str__(self):
        return self.color

还有我的产品型号:

class Product(models.Model):
    ...
    color = models.ForeignKey('Color', on_delete=CASCADE)
    ...

所以我需要创建一个过滤器,例如我可以获取所有红色、蓝色或黄色产品

我该怎么做?

【问题讨论】:

    标签: python django django-filter multiple-choice


    【解决方案1】:

    要为模型创建具有多种选择的过滤器,您可以使用ModelMultipleChoiceFilter [django-filter docs]。您还可以传递您想要用于该字段的表单widget,因此对于复选框,您将传递CheckboxSelectMultiple [Django docs]

    from django import forms
    import django_filters
    
    
    class ProductFilter(django_filters.FilterSet):
        color = django_filters.ModelMultipleChoiceFilter(queryset=Color.objects.all(), widget=forms.CheckboxSelectMultiple())
        
        class Meta:
            model = Product
            fields = ['color']  # Add any other fields you want to filter to the list
    

    【讨论】:

    • AttributeError: 'ellipsis' 对象没有属性'split'
    • @Ihor 呃,你不应该在那里写...,你需要用你可能想要过滤的其他字段替换那些。
    • 哦抱歉,我忘记了
    • 我可以将其更改为复选框而不是列表吗?
    • 是的,这就是我想要的。非常感谢!!
    【解决方案2】:

    您可以.filter(…) [Django-doc] 使用:

    Product.objects.filter(<b>color__name=<i>some_color_name</i></b>)

    some_color_name 例如“黄色”。如果你有一个颜色对象,你可以使用:

    Product.objects.filter(<b>color=<i>some_color</i></b>)

    可以使用双下划线 (__) 来“透视”关系。

    【讨论】:

    • 但是如果我有一个 django-filter 表单呢?而且我不仅需要一种颜色。我需要几个例如我的数据库中有 20 种颜色,用户希望获得具有他最喜欢的颜色的产品
    • @ihor: 然后你可以用Product.objects.filter(color__name__in=['Red', 'Blue'])过滤
    • @ihor:对于 django-filter,您也可以指定 __in 查找:stackoverflow.com/a/59988897/67579
    • 我的意思是如果 django-filter 需要内置的 django-filter 过滤器,如何使用这个过滤器添加一个字段?
    • @ihor:您可以通过将小部件指定为CheckboxSelectMultiple 来做到这一点,
    猜你喜欢
    • 2016-03-28
    • 1970-01-01
    • 2017-09-28
    • 2013-04-03
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多