在Django中实现同时搜索用户first name和last name的功能
实现方案
你只需要修改views.py中的搜索过滤逻辑即可,具体操作如下:
步骤1:导入Django数据库函数
在views.py顶部添加以下导入语句:
from django.db.models import Value from django.db.models.functions import Concat
步骤2:修改搜索过滤逻辑
把原来的User.objects.filter(...)部分替换为以下代码,新增拼接完整姓名匹配的规则:
if (search_post is not None) and search_post: # 先去除搜索内容中多余的连续空格和首尾空格,避免匹配异常 search_post = ' '.join(search_post.strip().split()) # 拼接first_name和last_name为完整姓名,增加完整姓名匹配规则 allusername = User.objects.annotate( full_name=Concat('first_name', Value(' '), 'last_name') ).filter( Q(first_name__icontains=search_post) | Q(last_name__icontains=search_post) | Q(username__icontains=search_post) | Q(email__icontains=search_post) | Q(full_name__icontains=search_post) ) if not allusername: allusername = User.objects.all().order_by("-date_joined")
如果需要支持「姓+名」顺序的搜索,只要在filter的OR条件里再增加一行即可:
Q(Concat('last_name', Value(' '), 'first_name')__icontains=search_post)
可选优化:修改搜索提示文案
你可以把allstaff.html里的搜索提示<h5>Search for Staff First Name/ Staff Username</h5>修改为<h5>搜索员工姓名、用户名、邮箱</h5>,和现有搜索能力匹配。
修改完成后,输入admin Tan这类组合姓名就能直接匹配到对应用户了,原有的单个字段搜索能力也不会受影响。
内容的提问来源于stack exchange,提问作者Rainysky
相关产品推荐
相关产品推荐

