Поиск по имени и фамилии пользователя вместе в django
У меня есть веб-страница, на которой отображаются данные пользователя, такие как его имя и фамилия, имя пользователя, электронная почта и т.д. Но я могу искать только имя или фамилию пользователя в строке поиска, как мне сделать так, чтобы пользователь мог вводить как имя, так и фамилию и выводить данные?
Вот как выглядит моя веб-страница, как показано на рисунке ниже (Ex: Отображение имен сотрудников: admin (Имя) и Tan (Фамилия):
)views.py
@login_required()
def allstaff(request):
search_post = request.GET.get('q')
if (search_post is not None) and search_post:
allusername = User.objects.filter(Q(first_name__icontains=search_post) | Q(last_name__icontains=search_post) | Q(
username__icontains=search_post) | Q(email__icontains=search_post))
if not allusername:
allusername = User.objects.all().order_by("-date_joined")
else:
allusername = User.objects.all().order_by("-date_joined")
page = request.GET.get('page')
paginator = Paginator(allusername, 3)
try:
allusername = paginator.page(page)
except PageNotAnInteger:
allusername = paginator.page(1)
except EmptyPage:
allusername = paginator.page(paginator.num_pages)
context = {'allusername': allusername, 'query': search_post}
return render(request, 'allstaff.html', context)
allstaff.html
Вы можете использовать функцию базы данных Concat
.
User.objects.annotate(full_name=Concat("first_name", V(" "), "last_name"))
from django.db.models import Value as V
from django.db.models.functions import Concat
@login_required()
def allstaff(request):
search_post = request.GET.get('q')
if (search_post is not None) and search_post:
allusername = User.objects.annotate(full_name=Concat("first_name", V(" "), "last_name")).filter(Q(full_name=search_post)| Q(first_name__icontains=search_post) | Q(last_name__icontains=search_post) | Q(
username__icontains=search_post) | Q(email__icontains=search_post))
if not allusername:
allusername = User.objects.all().order_by("-date_joined")
else:
allusername = User.objects.all().order_by("-date_joined")
page = request.GET.get('page')
paginator = Paginator(allusername, 3)
try:
allusername = paginator.page(page)
except PageNotAnInteger:
allusername = paginator.page(1)
except EmptyPage:
allusername = paginator.page(paginator.num_pages)
context = {'allusername': allusername, 'query': search_post}
return render(request, 'allstaff.html', context)