【问题标题】:Trouble rendering results from searchbar in Django在 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部门名称或标签的项目?

标签: html django view searchbar


【解决方案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的实现ListViewccbv.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 个参数进行过滤时遇到了错误。
猜你喜欢
  • 1970-01-01
  • 2013-04-02
  • 1970-01-01
  • 2018-02-03
  • 2018-10-25
  • 1970-01-01
  • 1970-01-01
  • 2021-01-25
  • 1970-01-01
相关资源
最近更新 更多