tengke 发表于 2023-4-21 18:12:51

搜索框显示问题

from django.shortcuts import render

def cs(request):
    da = {}
    n = request.GET.get('q')
    if n:
      da["name"] = n
    ss = models.Userinfo.objects.filter(**da)
    print()
    return render(request, 'your_template_name.html', {'deat': ss})


那如果我搜索的时候想要匹配全部的字段要怎么操作呢

陶远航 发表于 2023-4-21 18:12:52

如果你想在搜索时匹配全部字段,可以使用 Django ORM 的 Q 对象。Q 对象提供了一种高级查询语法,可以在查询中使用逻辑运算符,如 and、or、not 等。

以下是一个使用 Q 对象进行搜索的示例代码:
from django.db.models import Q
from django.shortcuts import render
from .models import Userinfo

def cs(request):
    query = request.GET.get('q')
    results = []
    if query:
      queries = query.split()# 将搜索关键词拆分为多个查询
      q = Q()
      for query in queries:
            q |= Q(name__icontains=query)# 在多个查询之间使用 or 连接
            q |= Q(email__icontains=query)
            # 将需要匹配的字段和查询条件组合成 Q 对象

      results = Userinfo.objects.filter(q)# 使用 Q 对象进行查询

    return render(request, 'your_template_name.html', {'results': results})
在上面的代码中,我们将搜索关键词拆分为多个查询,然后将这些查询使用 or 连接起来,形成一个 Q 对象。在使用 Q 对象进行查询时,我们可以直接将 Q 对象作为 filter() 方法的参数传入,这样 Django ORM 就会自动将多个查询条件进行 or 连接,返回满足条件的结果集。

需要注意的是,在使用 Q 对象进行查询时,我们需要明确指定需要匹配的字段和查询条件,并且要使用 __icontains 操作符进行模糊匹配。如果你想要精确匹配某个字段,可以使用 __exact 操作符进行精确匹配。

isdkz 发表于 2023-4-21 18:16:48

如果您希望搜索时匹配全部字段,您需要使用 Django 的 `Q` 对象来构建复杂的查询。首先,请确保导入 `Q` 对象:

from django.db.models import Q


然后,您可以使用 `Q` 对象组合各个字段的匹配条件。例如,假设您的 `Userinfo` 模型包含以下字段:`id`,`name`,`password`,`age` 和 `daa`。要匹配所有这些字段,您可以修改 `cs` 函数如下:

from django.shortcuts import render
from django.db.models import Q

def cs(request):
    n = request.GET.get('q')
    if n:
      ss = models.Userinfo.objects.filter(
            Q(id__icontains=n) |
            Q(name__icontains=n) |
            Q(password__icontains=n) |
            Q(age__icontains=n) |
            Q(daa__icontains=n)
      )
    else:
      ss = models.Userinfo.objects.all()
   
    print()
    return render(request, 'your_template_name.html', {'deat': ss})


这里,我们使用了 `icontains` 查找方式,它允许您执行不区分大小写的子字符串查找。`Q` 对象用 `|` 符号连接,表示 "或" 操作,这样搜索时只要有任意一个字段匹配即可。

请注意,如果 `age` 和 `daa` 是非字符串类型的字段(例如,整数或日期),您需要将它们转换为字符串进行比较。例如,如果 `age` 是整数字段,您可以将查询条件修改为:

Q(age__icontains=str(n))


同样,别忘了将 `'your_template_name.html'` 替换为您实际使用的模板文件名。现在,当您搜索时,结果将匹配所有指定字段。
页: [1]
查看完整版本: 搜索框显示问题