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