2016-06-12 17 views
0

私は、明らかにサイト全体で利用可能な検索フォームをnavbarに持っていますが、検索は検索コードが書かれているのでホーム・ページのみで動作します。私は、クラスベースのビューが、mixinなどの検索機能を簡単に追加できるような答えだと思っていました。クラスベースのビューを使用したサイト全体のnavbarの検索

Bottomline:私は検索フォーム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を含める必要があります。

問題を解決する重要なことの1つは、ジェネリッククラスベースのビューが作成したミックスインの右側にあることを確認することです。つまり、class HomeListView(Searchmixin, ListView)です。これは、Pythonが継承しているものに基づいてクラスを構築する順序があるためです。デフォルトのものが想定される前に上書きされると、競合が発生することがあります。

+0

私はそれを知らなかった。私の問題は、提示されたコードに何らかの形で欠陥があり、私が解読できないように見えることです。申し訳ありませんが、私はそれをもっと明確にすべきでした。 –

0

SearchMixinを使用する代わりに、SearchViewを作成し、URLを割り当ててそこから検索結果を返すことをお勧めします。あなたのJavaScriptで今

# 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 

、あなたはhttp://www.your_site.com/search/?q=some_search_termに非同期GET要求を実行し、結果をフェッチし、DOMにそれらを追加することができます。お役に立てれば。

関連する問題