如何在Django的现有页面中包含搜索表单?

时间:2019-02-06 06:08:22

标签: python django

我在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路径实际上是可行的,但这不是我所需要的。

2 个答案:

答案 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名称相匹配,路径参数中的名称都没有关系。