2016-06-12 11 views
0

Ich habe ein Suchformular in der Navbar, die offensichtlich Site-weit verfügbar ist, jedoch funktioniert die Suche nur auf der Homepage, denn das ist die Ansicht der Suchcode geschrieben. Ich dachte, dass klassenbasierte Ansichten die Antwort wären, so dass ich die Suchfunktion einfach als Mix-In oder ähnliches hinzufügen könnte.Site Wide Navbar Suche mit Klassen basierten Ansichten

Grundlinie: Ich habe Probleme mit der Suchfunktion in einer Klasse DRY

Das Suchformular Rückkehr www.site.com/?q=search basiert abstrahiert. Ich muss q von der GET-Anfrage ergreifen und diese Information zu meiner search.html Seite zurückbringen.

Dies ist mein Code, wie es

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) 

Antwort

0

Nice job steht Ihre erste Website zu schaffen. In jeder Ansicht, in der Sie eine funktionale Suchleiste haben möchten, sollten Sie die von Ihnen erstellte SearchMixin einschließen.

Eine wichtige Sache, die Ihnen einige Probleme auf der Straße erspart, ist sicherzustellen, dass die generischen klassenbasierten Ansichten auf der rechten Seite aller von Ihnen erstellten Mixins liegen - also class HomeListView(Searchmixin, ListView). Das liegt daran, dass Python eine Reihenfolge hat, in der es die Klasse basierend auf dem, was es erbt, aufbaut. Manchmal kann es Konflikte geben, wenn die Standard überschrieben werden, bevor sie es tun sollen.

+0

Danke Ich wusste das nicht. Mein Problem ist auch, dass der vorgestellte Code in gewisser Weise fehlerhaft ist, was ich nicht entziffern kann. Tut mir leid, ich hätte das deutlicher machen sollen. –

0

Anstatt SearchMixin zu verwenden und überall zu erben, schlage ich vor, einen SearchView zu erstellen, ihm eine URL zuzuordnen und die Suchergebnisse von dort zurückzugeben.

# 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 

Jetzt in Ihrem JavaScript können Sie asynchrone GET Anfrage http://www.your_site.com/search/?q=some_search_term, führen und die Ergebnisse holen und sie in DOM anhängen. Hoffe das hilft.