【问题标题】:Search controller is fetching the wrong template in Django搜索控制器在 Django 中获取错误的模板
【发布时间】:2021-08-28 10:19:39
【问题描述】:

我正在尝试编写控制器来搜索文章。但是搜索没有找到任何东西,并且出现了一个没有在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>

我做错了什么?

【问题讨论】:

  • 你能分享你的完整 urls.py 吗?你可能有另一个路径匹配“/search/”

标签: django django-models django-views django-forms django-templates


【解决方案1】:

你应该枚举对象,所以:

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

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

您还应该在 &lt;tag&gt;/ 路径之前指定 search/ 路径,因为 Django 总是采用第一个匹配的项目,如果您编写 search/ 那么它将首先与 &lt;tag&gt;/ 匹配,因此不会触发SearchView

urlpatterns 因此应该如下所示:

urlpatterns = [
     #       &downarrow; 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('tag/<tag>/', ArticlesByTagsList.as_view(), name='articles_by_tags'),
]

【讨论】:

  • @ilsurealism:您能否将urlpatterns 添加到您的问题中。 edit 问题。
  • @ilsurealism:您需要在urlpatterns 中首先指定search_view,因为&lt;tag&gt; 也可以与搜索匹配。
  • @ilsurealism:通常这不应该是必要的,也许您可​​以使用list_view.html 编辑问题?您确定您重新启动服务器以检查它是否适用于原始模板?
  • @ilsurealism:你是否为同一个template_name传递了两个模板?
  • 没有。对不起,我明白错误是什么。我错误地指定了 search_view.html 模板的路径(我忘了指定目录)。
猜你喜欢
  • 2021-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多