在 Django 中无法从搜索栏呈现结果
Posted
技术标签:
【中文标题】在 Django 中无法从搜索栏呈现结果【英文标题】:Trouble rendering results from searchbar in Django 【发布时间】:2021-06-18 02:55:39 【问题描述】:我一直在使用 django 中的搜索栏,我很接近但在将结果呈现到页面时遇到了一些问题。
Views.py
class SearchResultsView(ListView):
model = Project
template_name = 'search_results.html'
def get_queryset(self):
proj=self.request.GET.get('proj')
proj_list=Project.objects.filter(
Q(name__icontains=proj) | Q(projectTag__icontains=proj)
)
proj_list1=Project.objects.filter(
Q(department__icontains=proj)
)
proj_list2 = list(set(proj_list) & set(proj_list1))
return proj_list2
class SearchPageView(TemplateView):
template_name = 'searchbar.html'
search_results.html
% extends 'main/base.html' %
<html>
%block content%
<h1> Search Results </h1>
% if proj %
<ul>
% for project in proj_list2%
<li>
project.name, project.department, project.projectTag
</li>
% endfor %
</ul>
% else %
<h2>sorry, no results</h2>
% endif %
%endblock%
</html>
每当我搜索肯定会产生结果的内容时,我都会收到“抱歉,没有结果”。
谢谢。请帮助我了解我的断开连接。更大的目标是添加不同的模型来查询(即不仅在项目中搜索,还可以按用户搜索)。
【问题讨论】:
% if proj_list2 %
但是搜索很奇怪,你只返回匹配both部门和名称或标签的项目?
【参考方案1】:
您正在检查错误的变量。元素的集合是object_list
,而不是proj
或proj_list2
:
% if object_list %
<ul>
% for project in object_list %
<li>
project.name, project.department, project.projectTag
</li>
% endfor %
</ul>
% else %
<h2>sorry, no results</h2>
% endif %
搜索也很奇怪,如果 both 部门 和 名称或 标签 匹配,您只会检索项目。我们可以将其简化为:
class SearchResultsView(ListView):
model = Project
template_name = 'search_results.html'
def get_queryset(self):
proj = self.request.GET.get('proj')
return =Project.objects.filter(
Q(name__icontains=proj) | Q(projectTag__icontains=proj),
department__icontains=proj
)
但奇怪部门和例如名称应该匹配。如果您想匹配这三个中的任何一个,我们可以使用:
class SearchResultsView(ListView):
model = Project
template_name = 'search_results.html'
def get_queryset(self):
proj = self.request.GET.get('proj')
return =Project.objects.filter(
Q(name__icontains=proj) |
Q(projectTag__icontains=proj) |
Q(department__icontains=proj)
)
【讨论】:
好的,但是为什么object_list中的元素集合呢?如果我想将项目另存为一件事,以便它通过我的 Project 表进行查询并呈现特定的结果视图,但我还希望搜索能够按用户搜索并让该元素集合通过我的 User 表查询和呈现不同的结果视图。 @AndrewBregman:因为ListView
将查询集作为object_list
和modelname_list
传递给模板(modelname
是小写的模型名称)。
@AndrewBregman:见get_context_data
的实现ListView
:ccbv.co.uk/projects/Django/3.1/django.views.generic.list/…
@AndrewBregman:如果你想传递额外的数据,你覆盖get_context_data
,你可以在上下文中添加额外的项目,但ListView
只会处理它获得的查询集来自get_queryset
方法。
当我将代码切换到 """def get_queryset(self): proj=self.request.GET.get('proj') return=Project.objects.filter( Q(name__icontains=proj ) | Q(projectTag__icontains=proj) | Q(department__icontains=proj) )""" 我出错了。我认为这就是我在原始代码中构建列表的原因,因为当我尝试传递 3 个参数进行过滤时遇到了错误。以上是关于在 Django 中无法从搜索栏呈现结果的主要内容,如果未能解决你的问题,请参考以下文章