2016-06-12 35 views
0

我在導航欄中有一個顯然可用的站點範圍的搜索表單,但是,搜索僅適用於主頁,因爲這是搜索代碼的視圖。我認爲基於類的視圖是答案,因此我可以輕鬆地將搜索功能添加爲混合或類似的東西。使用基於類的視圖進行站點範圍的導航欄搜索

底線:我有麻煩了基於抽象類中的搜索功能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) 

回答

0

做得好創建的第一個站點。在所有您希望擁有功能性搜索欄的視圖中,您應該包含您創建的SearchMixin

一個重要的事情可以爲您節省一些麻煩,確保通用的基於類的視圖位於您創建的任何mixin的右側 - 即class HomeListView(Searchmixin, ListView)。這是因爲Python有一個順序,它可以根據它繼承的內容構建類。有時候,如果默認設置在它們應該被覆蓋之前被覆蓋,那麼可能會有衝突。

+0

謝謝我不知道。我的問題是,所提供的代碼有些缺陷,我似乎無法破譯。對不起,我應該更清楚一點。 –

0

我建議創建一個SearchView,而不是使用SearchMixin並且隨處可見,併爲其分配一個URL並返回搜索結果。

# 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追加它們。希望這可以幫助。