首页 > 解决方案 > 如何在Django中检查框过滤器?

问题描述

我使用 Django 作为后端,使用 Postgres SQL 作为 DB,使用 HTML、CSS 和 Javascript 作为前端。我被困在过滤选项中,用户选择check一个品牌并在模板中显示选定的品牌列表。所以基本上是这样的:

在此处输入图像描述

我对每个类别都有多个规格。就像手机一样:

  1. 品牌
  2. 内存
  3. ROM等

到目前为止,我已经完成了列表过滤,但我想要复选框过滤。

代码在这里:

视图.py

def product(request, data=None):
    product = Product.objects.all()

    if data == None:
        proc = Product.objects.filter(category = 1)
    elif data == 'OnePlus' or data == 'boAt' or data == 'Redmi' or data == 'realme':
        proc = Product.objects.filter(category = 1).filter(brand = data) 

    return render(request, 'list/processor.html', {'product': product, 'proc':proc,})

产品.html

<ul class="list-group">
                <a style="text-decoration:none" href="{% url 'main:product' %}">
                    <li class="list-group-item d-flex justify-content-between align-items-center">
                        All
                    </li>
                </a>
                <a style="text-decoration:none" href="{% url 'main:productdata' 'OnePlus'%}">
                    <li class="list-group-item d-flex justify-content-between align-items-center">
                        OnePlus
                    </li>
                .......  
            </ul>

我已经搜索Django-Filter但不存在复选框过滤的正确实施。Checkbox 过滤将如何完成,因为此过程需要太多时间。有没有什么简单的方法可以让所有特定的列都得到一个过滤器,例如。如果品牌名称LG重复多次查询会将它们过滤为一个并将它们附加到复选框过滤?

标签: djangodjango-modelsdjango-viewsdjango-filterdjango-template-filters

解决方案


根据您将复选框作为链接的实现,通过获取请求而不是 URL 参数进行此过滤是最有意义的。

例如;

    def product(request):
        brand = request.GET.get('brand')

        if brand:
            product = Product.objects.filter(category=1).filter(brand=brand)
        else:
            product = Product.objects.filter(category=1)

        products = Product.objects.all() 
    
        return render(
            request, 'list/processor.html',
            {'products': products, 'product': product,}
        )

product.html

    <ul class="list-group">
                    <a style="text-decoration:none" href="{% url 'main:product' %}">
                        <li class="list-group-item d-flex justify-content-between align-items-center">
                            All
                        </li>
                    </a>
                    <a style="text-decoration:none" href="{% url 'main:productdata' %}?brand=OnePlus">
                        <li class="list-group-item d-flex justify-content-between align-items-center">
                            OnePlus
                        </li>
                    .......  
                </ul>

要使用复选框,您需要一个表单来处理用户的输入;

<form action="{% url 'main:productdata' %}" method="get">
    <label for="oneplus">OnePlus: </label>
    <input id="oneplus" type="checkbox" name="oneplus">
    <input type="submit" value="OK">
</form>
    def product(request):
        oneplus = request.GET.get('oneplus')

        if oneplus:
            product = Product.objects.filter(category=1).filter(brand__iexact=oneplus)
        else:
            product = Product.objects.filter(category=1)

        products = Product.objects.all() 
    
        return render(
            request, 'list/processor.html',
            {'products': products, 'product': product,}
        )

如果我是你,我也会使用 django 表单来简化渲染。表格可能看起来像这样;

class BrandForm(forms.Form):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        brands = Product.objects.filter(category=1).values_list('brand', flat=True)
        for brand in brands:
            self.fields[f'{brand}'] = forms.BooleanField(label=f'{brand}')

在您看来,您需要创建表单的一个实例并将其传递到上下文中。


        form = BrandForm()
        return render(
            request, 'list/processor.html',
            {'form': form, 'products': products, 'product': product}
        )

然后渲染表单;

<form action="{% url 'main:productdata' %}" method="get">
    {{ form.as_p }}
    <input type="submit" value="OK">
</form>

推荐阅读