在 Django 中一起搜索用户的名字和姓氏

Search for user first name and last name together in django

我有一个网页,它显示用户的详细信息,例如他们的名字和姓氏、用户名、电子邮件等。但是我只能在搜索栏中搜索用户的名字或姓氏,如何我是否可以让用户能够输入用户的名字和姓氏并显示详细信息?

我的网页如下图所示(例如:员工姓名显示为 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

{% extends "home.html" %}
{% block content %}
<style>
table {
    border-collapse:separate;
    border:solid black 1px;
    border-radius:6px;
    -moz-border-radius:6px;
}

td, th {
    border-left:solid black 1px;
    border-top:solid black 1px;
}

th {
    border-top: none;
}

td:first-child, th:first-child {
     border-left: none;
}



</style>


   <div style="padding-left:16px">
     <br>
       <div class="form-block">
         <h5>Search for Staff First Name/ Staff Username</h5>
        <form class="form-inline my-2 my-lg-0" action="{% url 'allstaff' %}" method='GET' value='{{ request.GET.q }}'>
            <input class="form-control mr-sm-2" type="text" placeholder="Search" aria-label="Search" name="q" value='{{ request.GET.q }}'/>
            <button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
        </form>
           <br>

 <div class="form-block">
     <table>
  <tr>
    <th>Staff Name</th>
      <th>Staff Username</th>
      <th>Email</th>
      <th>Date Joined</th>
      <th>Last Login</th>
      <th>Admin</th>
      <th>Customer Service</th>
      <th>Logistic</th>
      <th>Action</th>
  </tr>
         {% for user in allusername %}


  <tr>
        <td>{{user.first_name}} {{user.last_name}}</td>
      <td>{{user.username}}</td>
      <td>{{user.email}}</td>
      <td>{{user.date_joined}}</td>
      <td>{{user.last_login}}</td>
      <td>{{user.is_admin}}</td>
      <td>{{user.is_customer}}</td>
      <td>{{user.is_logistic}}</td>
      <td>
            <form action="{% url 'update' user.id %}" method="post">
              {% csrf_token %}
          <button type="submit" class="btn btn-sm btn-info">Update</button>
      </form>

      </td>
      <td>

          <form action="{% url 'delete' user.id %}" method="post">
              {% csrf_token %}
          <button type="submit" class="btn btn-sm btn-danger">Delete</button>
      </form>
      </td>
     </tr>

{% endfor %}

</table>

     {% if allusername.has_other_pages %}

  <ul class="pagination pr-3 mr-1 ml-auto">

    {% if allusername.has_previous %}
      <li><a href="?q={{ query|urlencode }}&page={{ allusername.previous_page_number }}">&laquo;</a></li>
    {% else %}
      <li class="disabled"><span>&laquo;</span></li>
    {% endif %}
    {% for i in allusername.paginator.page_range %}
      {% if allusername.number == i %}
        <li class="active"><span>{{ i }} <span class="sr-only">(current)</span></span></li>
      {% else %}
        <li><a href="?q={{ query|urlencode }}&page={{ i }}">{{ i }}</a></li>
      {% endif %}
    {% endfor %}
    {% if allusername.has_next %}
      <li><a href="?q={{ query|urlencode }}&page={{ allusername.next_page_number }}">&raquo;</a></li>
    {% else %}
      <li class="disabled"><span>&raquo;</span></li>
    {% endif %}
    </ul>
    {% endif %}

     <br>
     <h5>*Note: True means that the staff is in this role, False means that the staff is not in this role.</h5>




</div>
       </div>
   </div>
{% endblock %}

您可以使用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)