Контроллер поиска получает неправильный шаблон в 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'),
]