如何在 Django 中选中框过滤器?
How to Check box filter In Django?
我使用 Django 作为后端,Postgres SQL 作为数据库,HTML、CSS 和 Javascript 作为前端。我卡在过滤选项中,用户选择 check
一个品牌并在模板中显示所选品牌列表。所以基本上是这样的:
我对每个类别都有多个规格。像手机有:
- 品牌
- 内存
- ROM
等等
到目前为止,我已经完成了列表过滤,但我想要复选框过滤。
代码在这里:
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
重复 多次 查询会将它们过滤为一个并将它们附加到复选框过滤?
根据您将复选框作为链接的实现,通过 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>
我使用 Django 作为后端,Postgres SQL 作为数据库,HTML、CSS 和 Javascript 作为前端。我卡在过滤选项中,用户选择 check
一个品牌并在模板中显示所选品牌列表。所以基本上是这样的:
我对每个类别都有多个规格。像手机有:
- 品牌
- 内存
- ROM 等等
到目前为止,我已经完成了列表过滤,但我想要复选框过滤。
代码在这里:
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
重复 多次 查询会将它们过滤为一个并将它们附加到复选框过滤?
根据您将复选框作为链接的实现,通过 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>