Django 中的搜索栏不工作:类似查询未执行

Searchbar in Django not working: like query is not executed

我正在用 Django 开发应用程序。

我的模板上显示了数据库的内容glossario.html广告我想实现一个搜索栏来查询数据库并仅显示查询结果。

所以我在glossario.html

中设置了工具栏
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"> 

<div class="topnav">

    <a id="pulsante_ricerca_avanzata" href="#Ricerca_avanzata">Ricerca avanzata</a>

    <div id="blocco_ricerca_semplice" class="search-container">

      <form method="GET" action="{% url 'glossario' %}">

        <input type="text" placeholder="Ricerca terminologia..." name="q" value="{{request.GET.q}}">  
        <button id="cancel_search_button" type=""><i class="fa fa-trash"></i></button>

        <button id="search_button" type="submit"><i class="fa fa-search"></i></button>

      </form>

    </div>

</div>

views.py中准备了一个只显示查询结果的函数:

def vista_ricerca_semplice(request):

    template = "glossario.html"

    query = request.GET.get('q')

    selected_entries = glossary_entry.objects.filter(Q(Lemma_it__icontains=query))

    context = {'selected_entries':selected_entries}


    return render(request, template, context)

注意:
Lemma_it是我要搜索的模型字段,glossary_entry是我模型的名字
说实话,我正在寻找一个命令来对所有模型字段进行查询而无需键入

selected_entries = glossary_entry.objects.filter(Q(Lemma_it__icontains=query) | Q(field2__icontains=query) | Q(field3__icontains=query) ...)    

app/urls.py中我映射了搜索结果的url:

from django.urls import path
from . import views
from .views import vista_ricerca_semplice 

urlpatterns=[
    path('', views.home, name='home'),
    path('glossario', views.glossario, name="glossario"),
    path('glossario', views.vista_ricerca_semplice, name="vista_ricerca_semplice"),
]

但这根本行不通。 例如,如果我输入 "attempt1",控制台 returns

[19/Sep/2019 18:08:00] "GET /glossario?q=attempt1 HTTP/1.1" 200 126941

它更新了页面但没有查询。观点没有改变。 这里有什么错误?

我一直在从事与您类似的项目,但我的项目是学校管理系统。 我已经实现了一个搜索栏,它运行良好。

views.py

def search_student(request):
student_list = DataStudent.objects.all()
student_filter = StudentFilter(request.GET, queryset=student_list)
return render(request, 'accounts/Students/Search/student_list.html', {'filter': student_filter})

urls.py

from django.conf.urls import url, include
from . import views
urlpatterns=[
url(r'^search_student', views.search_student, name="search_student")
]

student_list.html

    {% extends 'base.html' %}
{% block body %}
<div class="container" style="margin-left: 200px;font-size: 20px; padding: 0px 10px;">
  {% load crispy_forms_tags %}
  <form method="get">
    <nav class="container nav navbar-expand navbar" >
      <div style="color:black; font-size:160%">
          <ul class="navbar-nav mr-auto" >
               <li class="nav-item">
              {{ filter.form.name|as_crispy_field  }}
              </li>
              <li class="nav-item">
             {{ filter.form.Class|as_crispy_field  }}
             </li>
             <li class="nav-item">
             {{ filter.form.stream|as_crispy_field  }}
            </li>
            <li style="margin-left:5%"> <button type="submit" style="margin-top:60%;" class="btn btn-primary">Search </button>
            </li>
          </ul>
      </div>
  </nav>
  </form>
  <ul>
    <div class="container" style="margin-left:2px; font-size:15px; padding:3px">
    <table class="table table-hover" border="2">
       <thead class="table-success">
        <tr>
             <td>Reg Number</td>
             <td>Photo</td>
             <td>Name</td>
             <td>Class</td>
             <td>Stream</td>
             <td>Admision No</td>
             <td>Action</td>
         </tr>
       </thead>
       <tbody>
           {% for student in filter.qs %}
         <tr>
           <td>{{ student.admission_no}}</td>

           <td>{% if student.Student_Photo %}<img src="{{ student.Student_Photo.url}}" width="50">{% endif %}</td>
           <td>{{ student.name}}</td>
           <td>{{ student.Class}}</td>
           <td>{{ student.stream}}</td>
           <td>{{ student.admission_no}}</td>
           <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.0/css/bootstrap.min.css" rel="stylesheet" id="bootstrap-css">
           <td><a class="btn btn-primary a-btn-slide-text" href="{% url 'singlestudentdetails' pk=student.id  %}"><span class="glyphicon glyphicon-eye-open" aria-hidden="true"></span>
          <span><strong>View</strong></span></a>
             <a class="btn btn-danger a-btn-slide-text" href="{% url 'deletestudent' pk=student.id %}"><span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
            <span><strong>Delete</strong></span> </a>
           </td>
            {% endfor %}
         </tr>
       </tbody>
    </table>
    </div>
  </div>
{% endblock %}

我希望这对开发者有帮助,编码愉快

已解决

正如 所指出的,问题是我有两个视图函数指向同一路径(模板)。

这不可能。一个 template/path 不能被多个视图函数指向。 所以我删除了所有与我之前的视图函数相关的代码 vista_ricerca_semplice

我通过更改 urls.py 和 views.py 中的代码解决了我的问题,如下所示:

views.py:

def glossario(request):

    query = request.GET.get('q')
    template = "glossario.html" 

    # query executed
    if query:

        query = request.GET.get('q') 
        selected_entries = glossary_entry.objects.filter(Q(Lemma_it__icontains=query))            
        return render(request, template, {'all_entries':selected_entries})

    # no query
    else:

        all_entries = glossary_entry.objects.all 
        return render(request, template, {'all_entries':all_entries})

在Urls.py

urlpatterns=[
    path('', views.home, name='home'),
    path('glossario', views.glossario, name="glossario"),
]