如何在搜索栏中按布尔字段过滤 - 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的主要内容,如果未能解决你的问题,请参考以下文章

如何在搜索栏中按名字和姓氏排序 - Sqlite

在视图中按布尔值过滤 Foreach

如何在 django 中按日期范围过滤记录?

在Django中按关系字段过滤多对多关系

如何在 Django 中按计算字段复杂排序?

如何在 Django 中按类别筛选产品?