Как отобразить список результатов поиска в Django 4

Я пишу приложение Django для управления лидами продаж. Из шаблона, который перечисляет страницу с предложениями, я хочу дать пользователю возможность искать все предложения, используя имя и фамилию в качестве критериев поиска. Когда я ввожу фамилию и нажимаю ввод, страница мерцает, но остается на той же странице, а не на шаблоне, который я создал для списка результатов поиска.

Ниже приведены мои представления, урлы и шаблоны. Что я упустил?

views.py

class LeadsListView(ListView):
    model = Lead
    template_name = 'leads/list.html'
    context_object_name = 'leads_list'
    paginate_by = 10

    def get_queryset(self):
        return Lead.objects.order_by('id')

class LeadsSearchResultsView(ListView):
    model = Lead
    context_object_name = 'search_results'
    template_name = 'leads/search_results.html'
    paginate_by = 10

    def get_queryset(self):
        query = self.request.GET.get('q')

        return Lead.objects.filter(
            Q(last__icontains=query) | Q(first__icontains=query)
        )

urls.py

from django.urls import path
from .views import LeadsListView, LeadsDetailView, LeadsCreateView
from .views import LeadsSearchResultsView

app_name = 'lead'

urlpatterns = [
    path('', LeadsListView.as_view(), name='list'),
    path('<int:pk>/', LeadsDetailView.as_view(), name='detail'),
    path('', LeadsCreateView.as_view(), name='create'),
    path('', LeadsSearchResultsView.as_view(), name='search_results'),
]

Шаблон, который (успешно!) перечисляет лиды, list.html:

{% extends 'base.html' %}

{% block content %}
<nav aria-label="Page navigation example">
    <ul class="pagination">
        {% if page_obj.has_previous %}
        <li class="page-item">
            <a class="page-link" href="?page={{ page_obj.previous_page_number }}" aria-label="Previous">
                <span aria-hidden="true">&laquo;</span>
                <span class="sr-only">Previous</span>
            </a>
        </li>
        {% endif %}
        {% if page_obj.has_next %}
        <li class="page-item">
            <a class="page-link" href="?page={{ page_obj.next_page_number }}" aria-label="Next">
                <span aria-hidden="true">&raquo;</span>
                <span class="sr-only">Next</span>
            </a>
        </li>
        {% endif %}
        <form action="{% url 'lead:search_results' %}" method="get">
            <input type="search" name="q" value="{{ request.GET.q }}" placeholder="Search by last name"
                class="form-control">
        </form>
    </ul>
</nav>

<table class="table table-hover table-bordered">
    <thead>
        <tr>
            <th scope="col">Lead No.</th>
            <th scope="col">First</th>
            <th scope="col">Last</th>
            <th scope="col">Phone</th>
            <th scope="col">Email</th>
            <th scope="col">Zip Code</th>
        </tr>
    </thead>
    <tbody>
        {% for lead in page_obj %}
        <tr>
            <td><a href="{% url 'lead:detail' lead.pk %}">{{ lead.pk }}</a></td>
            <td>{{ lead.first }}</td>
            <td>{{ lead.last }}</td>
            <td>{{ lead.mobile }}</td>
            <td>{{ lead.email }}</td>
            <td>{{ lead.zipcode }}</td>
        </tr>
        {% endfor %}
    </tbody>
</table>
{% endblock content %}

И, наконец, шаблон, который должен перечислять результаты поиска, но не перечисляет:

{% extends 'base.html' %}

{% block content %}
<nav aria-label="Page navigation example">
    <ul class="pagination">
        {% if page_obj.has_previous %}
        <li class="page-item">
            <a class="page-link" href="?page={{ page_obj.previous_page_number }}" aria-label="Previous">
                <span aria-hidden="true">&laquo;</span>
                <span class="sr-only">Previous</span>
            </a>
        </li>
        {% endif %}
        {% if page_obj.has_next %}
        <li class="page-item">
            <a class="page-link" href="?page={{ page_obj.next_page_number }}" aria-label="Next">
                <span aria-hidden="true">&raquo;</span>
                <span class="sr-only">Next</span>
            </a>
        </li>
        {% endif %}
        <form action="{% url 'lead:search_results' %}" method="get">
            <input type="search" name="q" value="{{ request.GET.q }}" placeholder="Search by last name"
                class="form-control">
        </form>
    </ul>
</nav>

<table class="table table-hover table-bordered">
    <thead>
        <tr>
            <th scope="col">Lead No.</th>
            <th scope="col">First</th>
            <th scope="col">Last</th>
            <th scope="col">Phone</th>
            <th scope="col">Email</th>
            <th scope="col">Zip Code</th>
        </tr>
    </thead>
    <tbody>
        {% for lead in page_obj %}
        <tr>
            <td><a href="{% url 'lead:detail' lead.pk %}">{{ lead.pk }}</a></td>
            <td>{{ lead.first }}</td>
            <td>{{ lead.last }}</td>
            <td>{{ lead.mobile }}</td>
            <td>{{ lead.email }}</td>
            <td>{{ lead.zipcode }}</td>
        </tr>
        {% endfor %}
    </tbody>
</table>
{% endblock content %}

Ниже приведен ваш файл url.py

urlpatterns = [
    path('', LeadsListView.as_view(), name='list'),
    path('<int:pk>/', LeadsDetailView.as_view(), name='detail'),
    path('', LeadsCreateView.as_view(), name='create'),
    path('', LeadsSearchResultsView.as_view(), name='search_results'),
]

Здесь вы вызываете 3 разных класса представлений с одним и тем же url '', что неправильно.

Вы можете исправить это и продолжить.

Вернуться на верх