使用基于类的视图进行站点范围导航栏搜索

时间:2016-06-12 19:29:57

标签: python django django-views

我在导航栏中有一个显然可以在网站范围内使用的搜索表单,但是,搜索仅适用于主页,因为搜索代码是在视图中编写的。我认为基于类的视图是答案,我可以轻松地将搜索功能添加为mixin或类似的东西。

底线:我在基于类的DRY中抽象搜索功能时遇到问题

搜索表单返回www.site.com/?q=search。我需要从GET请求中获取q并将该信息返回到我的search.html页面。

这是我的代码

views.py

class HomeListView(ListView, Searchmixin):
     model = Part
     queryset = Part.objects.order_by('-creDate')
     template_name = 'parts/index.html'
     paginate_by = 20
     is_paginated = True

search.py​​

class SearchMixin(object):
    def sindex(self):
        query = self.request.GET.get('q')
        return httpResponse(query)


    def perf(self, query):
        if query is not None:
                pollist = self.objects.filter(
                                  Q(project__name__icontains=query) |
                                  Q(owner__icontains=query) |
                                  Q(description__icontains=query) |
                                  Q(pnumber__icontains=query)
                                          )

        return render(request, 'parts/search.html', pollist)

2 个答案:

答案 0 :(得分:0)

创建第一个网站的好工作。在您希望拥有功能搜索栏的每个视图中,您应该包含您已创建的SearchMixin

为您节省一些麻烦的一件重要事情是确保基于类的通用视图位于您创建的任何mixins的右侧 - 即{{1} }。这是因为Python有一个顺序,根据它继承的内容构建类。如果默认值在他们应该被覆盖之前被覆盖,有时可能会发生冲突。

答案 1 :(得分:0)

我建议您创建一个SearchMixin,为其分配一些网址并从那里返回搜索结果,而不是使用SearchView并在任何地方继承。

# urls.py
urlpatterns = [
    url(r'/search/', SearchView.as_view(), name='search'),
    ...
]

# views.py
class SearchView(ListView):
    paginate_by = 20  # to show 20 search results per page

    def get_template_names(self):
        return ['parts/search.html']

    def get_queryset(self):
        query = self.request.GET.get('q')
        pollist = YourModel.objects.all()
        if query:
            pollist = pollist.filter(
                Q(project__name__icontains=query) |
                Q(owner__icontains=query) |
                Q(description__icontains=query) |
                Q(pnumber__icontains=query)
            )
        return pollist

现在,在JavaScript中,您可以对http://www.your_site.com/search/?q=some_search_term执行异步GET请求,并获取结果并将其附加到DOM中。希望这会有所帮助。