Контроллер поиска получает неправильный шаблон в Django

Я пытаюсь написать контроллер для поиска статей. Но поиск ничего не находит и появляется шаблон, который не указан в views.py.

# views.py
class SearchView(ListView):
    template_name = 'search_view.html'

    def get_queryset(self):
        query = self.request.GET.get('q')
        object_list = Article.objects.filter(Q(title__icontains=query))
        return object_list

# urls.py
urlpatterns = [
    path('', ArticlesList.as_view(), name='list_view'),
    path('<tag>/', ArticlesByTagsList.as_view(), name='articles_by_tags'),
    path('articles/<slug:slug>', ArticleDetail.as_view(), name='detail_view'),
    path('articles/create/', ArticleCreate.as_view(), name='create_view'),
    path('articles/<slug:slug>/', ArticleUpdate.as_view(), name='update_view'),
    path('articles/<slug:slug>/delete/', ArticleDelete.as_view(), name='delete_view'),
    path('search/', SearchView.as_view(), name='search_view'),
]


#search_view.html
{% extends 'layout/basic.html' %}

{% block content %}
  {{ object_list }}
{% endblock %}

Форма выглядит следующим образом

<form action="{% url 'articles:search_view' %}" method="get">
    <input type="text" name="q" placeholder="Search...">
</form>

Что я делаю не так?

Вы должны перечислить объекты, так:

{% extends 'layout/basic.html' %}

{% block content %}
    {% for object in object_list %}
        {{ object.title }}
    {% endfor %}
{% endblock %}

Вы также должны указать путь search/ перед путем <tag>/, так как Django всегда берет элемент, который первым совпадает, и если вы напишите search/, то он сначала совпадет с <tag>/ и, таким образом, не сработает SearchView.

Таким образом, urlpatterns должен выглядеть следующим образом:

urlpatterns = [
     #       ↓ first specify the search/ path
     path('search/', SearchView.as_view(), name='search_view'),
     path('<tag>/', ArticlesByTagsList.as_view(), name='articles_by_tags'),
]

Следствием этого является то, что вы не можете использовать search в качестве тега. Если вы хотите иметь возможность посещать articles_by_tags с search в качестве тега, вы должны определить непересекающиеся шаблоны, так:

urlpatterns = [
     path('search/', SearchView.as_view(), name='search_view'),
     path('tag/<tag>/', ArticlesByTagsList.as_view(), name='articles_by_tags'),
]
Вернуться на верх