搜索控制器在 Django 中获取错误的模板

Search controller is fetching the wrong template in 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 %}
    {% <strong>for object in object_list</strong> %}
        {{ object.title }}
    {% endfor %}
{% endblock %}

你还应该在 <tag>/ 路径之前指定 search/ 路径,因为 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 用作标签。如果你应该能够访问带有 search 作为标签的 articles_by_tags,你应该定义非重叠模式,所以:

urlpatterns = [
     path('search/', SearchView.as_view(), name='search_view'),
     path('<strong>tag/</strong><tag>/', ArticlesByTagsList.as_view(), name='articles_by_tags'),
]