如何在搜索栏中按布尔字段过滤 - django
Posted
技术标签:
【中文标题】如何在搜索栏中按布尔字段过滤 - django【英文标题】:How to filter by boolean field in search bar - django 【发布时间】:2021-03-13 10:39:36 【问题描述】:我正在开发一个项目管理系统 Django 项目。 基本上在导航栏中,我实现了一个搜索器来搜索特定项目,如标题、客户、描述等。
我想让他们也可以搜索紧急项目(在我的项目模型中紧急是一个布尔字段),但我实现它的方式不起作用。
这是我的项目模型:
class Project(models.Model):
title = models.CharField(max_length=255)
description = models.CharField(max_length=1000)
client = models.ForeignKey(Cliente, on_delete=models.CASCADE)
complete = models.BooleanField(default=False)
urgent = models.BooleanField(default=False)
deadline = models.DateField()
...
制作搜索栏(在我的html文件中是:)
<form method="get" class="form-inline">
<input class="form-control mr-sm-2" name="q" id="id_q" type="text" placeholder="Search..." aria-label="Search" value="query">
<button class="btn btn-outline-dark my-2 my-sm-0" type="submit">
<svg viewBox="0 0 16 16" class="bi bi-search" fill="currentColor"
xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd"
d="M10.442 10.442a1 1 0 0 1 1.415 0l3.85 3.85a1 1 0 0 1-1.414 1.415l-3.85-3.85a1 1 0 0 1 0-1.415z"/>
<path fill-rule="evenodd"
d="M6.5 12a5.5 5.5 0 1 0 0-11 5.5 5.5 0 0 0 0 11zM13 6.5a6.5 6.5 0 1 1-13 0 6.5 6.5 0 0 1 13 0z"/>
</svg>
</button>
</form>
我是如何实现这个功能的:
def get_projects_qs(proj, query=None):
queryset = []
queries = query.split(" ")
for q in queries:
projects = proj.filter( Q(title__icontains=q) | Q(description__icontains=q) | Q(urgent__icontains=q) | Q(client__client__icontains=q) ).distinct()
for project in projects:
queryset.append(project)
return list(set(queryset))
现在,如果我执行 Q(urgent_icontains=q) 它不起作用,但如果我执行 Q(urgent=q) 它仅在第一次起作用,然后我收到此错误:
ValidationError at /marketing/
['“” value must be either True or False.']
【问题讨论】:
您的问题不清楚。再次仔细询问您想要做什么的所有细节并提供完整代码 对不起,英语不是我的第一语言,我才刚刚开始编码。我会尝试更好地解释...我有几个项目对象,其中包括标题、描述和布尔值的紧急状态。使用 serachbar,我可以搜索项目的标题或描述,但无法搜索紧急属性设置为 True 的项目。我使用 Q 查找使搜索器工作,但它不适用于紧急字段,我不知道该尝试什么 好的。如果产品是否紧急,我会建议用户可以选择的结构 【参考方案1】:假设我们有一个这样的模型:
class Project(models.Model):
title = models.CharField(max_length=255)
complete = models.BooleanField(default=False)
urgent = models.BooleanField(default=False)
.
.
.
views.py:
from . models import Product
def is_valid_queryparam(param):
return param != '' and param is not None
def search(request):
queryset = Product.objects.all()
search = request.GET.get('search')
complete = request.GET.get('complete')
urgent = request.GET.get('urgent')
if is_valid_queryparam(search):
queryset = queryset.filter(title__icontains=search)
if is_valid_queryparam(complete):
queryset = queryset.filter(complete=True)
elif is_valid_queryparam(urgent):
queryset = queryset.filter(urgent=True)
context =
'queryset': queryset
return render(request, 'search.html', context)
现在在模板中 (search.html):
<form id="mySearch" method="GET">
<input type="search" name="search" placeholder="Search..." />
<button" type="submit">Click to Search</button>
<input type="checkbox" name="complete" id="checkbox-1" onchange="$('#mySearch').submit();" % if request.GET.complete == 'on' % checked % endif %>
<label for="checkbox-1">complete</label>
<input type="checkbox" name="urgent" id="checkbox-2" onchange="$('#mySearch').submit();" % if request.GET.urgent == 'on' % checked % endif %>
<label for="checkbox-2">urgent</label>
</form>
【讨论】:
很高兴我能提供帮助。请考虑此搜索返回紧急或已完成的产品。如果您想同时返回紧急和已完成,请在最后一个过滤器参数中使用 if 而不是 elif 条件以上是关于如何在搜索栏中按布尔字段过滤 - django的主要内容,如果未能解决你的问题,请参考以下文章