【问题标题】:How to Check box filter In Django?如何在Django中检查框过滤器?
【发布时间】:2021-09-02 13:03:12
【问题描述】:

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

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

  1. 品牌
  2. 内存
  3. 只读存储器 等

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

代码在这里:

views.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,})

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' 'OnePlus'%}">
                    <li class="list-group-item d-flex justify-content-between align-items-center">
                        OnePlus
                    </li>
                .......  
            </ul>

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

【问题讨论】:

    标签: django django-models django-views django-filter django-template-filters


    【解决方案1】:

    根据您将复选框作为链接的实现,通过 get 请求而不是 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>
    

    【讨论】:

    • 您好,先生,我的网址是path('productdata/&lt;slug:data&gt;', views.product, name='productdata'),。以及我将如何在复选框上实现?
    • 我已经完成了 URL 实现并且工作得非常好。我将如何使用复选框?任何提示
    • 要正确执行复选框,您需要呈现一个表单,而不是链接列表。并且该表单必须使用GET 方法来提交。我会用一个简单的例子来更新我的答案。
    • 形式一似乎更简单更有意义
    • 非常感谢先生
    猜你喜欢
    • 1970-01-01
    • 2022-01-22
    • 2019-07-23
    • 2016-03-20
    • 2016-08-02
    • 2014-12-10
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    相关资源
    最近更新 更多