我在search
中有一个名为views.py
的函数,该函数用于处理搜索参数并在不同页面上显示结果。我的搜索表单位于主页模板上,因此我可以从那里进行搜索,然后重定向到我的搜索功能指定的页面。目前,我的views.py
如下所示:
from django.shortcuts import render
from django.views.generic import ListView
from django.core.paginator import Paginator
from core.models import Movie
from core.documents import MovieDocument
class MovieList(ListView):
model = Movie
template_name='movie_list.html'
paginate_by = 10
queryset = Movie.objects.all()
def search(request):
q = request.GET.get('q')
if q:
movies = MovieDocument.search().query("match", title=q)
else:
movies = ''
return render(request, 'search.html', {'movies': movies})
主页由MovieList
类提供,我在主页movie_list.html中具有以下用于搜索字段的html代码段:
<form method="get" action="{{ views.search}}">
<input id="q" name="q" type="text" placeholder="Search...">
</form>
MovieList的url路径如下所示:
path('movies',views.MovieList.as_view(),name='MovieList')
例如,当我在搜索框中键入“终止符”时,浏览器中的url更改为http://127.0.0.1:8000/movies?q=terminator
,但未调用搜索功能,并且没有任何反应。我如何才能使其正常工作,最好不必定义新的URL来捕获搜索查询字符串,而要通过在表单的action
属性中指定搜索功能,除非无法这样做?将搜索框放在自己的页面上并创建自己的url路径实际上是可行的,但这不是我所需要的。
答案 0 :(得分:0)
您不能直接在表单操作中添加views.search。
像这样更新您的视图:
class MovieList(ListView):
model = Movie
template_name='movie_list.html'
paginate_by = 10
queryset = Movie.objects.all()
show_search = False
def get(self, request, *args, **kwargs):
if self.show_search == True:
template_name='search.html'
else:
template_name='movie_list.html'
context = self.get_context_data()
return self.render_to_response(context)
def get_queryset(self):
try:
q = self.kwargs['q']
except:
q = ''
if (q != ''):
object_list = self.model.search().query("match", title=q)
self.show_search = True
else:
self.show_search = False
object_list = self.model.objects.all()
return object_list
答案 1 :(得分:0)
好,所以我终于弄清楚了,很简单。我要做的就是添加一个将搜索重定向到新页面的路径:
path('search',views.search,name='search')
然后我更新了表单标签:
<form method="get" action="{% url 'search' %}">
只要您指向正确的视图函数并且表单的操作与正确的url名称相匹配,路径参数中的名称都没有关系。