Поиск по имени и фамилии пользователя вместе в django

У меня есть веб-страница, на которой отображаются данные пользователя, такие как его имя и фамилия, имя пользователя, электронная почта и т.д. Но я могу искать только имя или фамилию пользователя в строке поиска, как мне сделать так, чтобы пользователь мог вводить как имя, так и фамилию и выводить данные?

Вот как выглядит моя веб-страница, как показано на рисунке ниже (Ex: Отображение имен сотрудников: admin (Имя) и Tan (Фамилия):

)

enter image description here

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)
Вернуться на верх