在 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,而不是projproj_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_listmodelname_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 中无法从搜索栏呈现结果的主要内容,如果未能解决你的问题,请参考以下文章

呈现搜索结果控制器时 UISearchBar 的高度不正确

如何在新页面中显示 django 搜索结果

如何对过滤器方法的结果进行条件渲染?反应

Vue Router 无法正常工作并添加了 #

搜索栏在 iOS 中无法正常工作 [关闭]

如果出现标签栏,则无法调整搜索结果控制器视图底部内容插图