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"),
]
我正在用 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"),
]