2017-10-13 7 views
0

Ich habe eine Vorlagenansicht, die eine vom Benutzer übergebene Suche aufnehmen soll. Ich plane, die Get-Methode zu verwenden, um eine Abfrage in der get_context_data durchzuführen, so dass ich einige Ergebnisse im HTML anzeigen kann. Leider funktioniert meine get_context_data nicht, während die get-Methode und der Versand in meiner templateview gut funktioniert. Die get_context_data wird überhaupt nicht ausgeführt, wenn der Benutzer die Suche sendet.klassenbasierter Vorlagenansichtskontext wird nicht gerendert

class PollSearchView(TemplateView): 
    template_name = 'polls/polls_search.html' 

    def get(self, request, **kwargs): 
     self.request.session["search"] = request.GET.get("search") 
     return render(request, 'polls/polls_search.html') 

    def dispatch(self, *args, **kwargs): 
     dispatch = super(PollSearchView, self).dispatch(*args, **kwargs) 
     #exit if no search 
     if self.request.GET.get("search") == None: 
      pass 
      return redirect('/') 
     return dispatch 

    def get_context_data(self, **kwargs): 
     context = super(PollSearchView, self).get_context_data(**kwargs) 
     search = self.request.session.get("search") 
     context["test"] = search 
     return context 

Ich habe eine andere Klasse, die auf der oben genannten Klasse eine Benutzereingabe über ein Formular umleitet.

class HomeView(TemplateView): 
    template_name = "home.html" 

    def get_context_data(self, *args, **kwargs): 
     context = super(HomeView, self).get_context_data(*args, **kwargs) 
     context["form"] = SearchForm() 

     return context 

Ich denke, die Form ganz gut funktioniert, warum die get_context_data findet nicht in alle Informationen, mir Leitbleche und ich suche alternative Möglichkeiten, um den Kontext auf meine Ergebnisse von get Basis zu machen. Jede Anleitung, warum das nicht funktioniert und wie man das macht, wird großartig sein.

Dank all

+2

Die 'TemplateView.get'-Methode ruft normalerweise' get_context_data' auf, aber Sie haben sie durch eine Methode ersetzt, die 'render' sofort aufruft. Es ist normalerweise eine schlechte Idee, "get" und "post" auf generische klassenbasierte Ansichten zu überschreiben - die einfach zu brechende Funktionalität wie diese oder du musst Code duplizieren. – Alasdair

+2

Und auf jeden Fall kann ich nicht sehen, warum Sie sich bemühen, die Daten in die Sitzung zu bringen. Ihre 'get_context_data' Methode kann direkt von' self.request.GET' darauf zugreifen. Die Sitzung dient zum Übergeben von Daten zwischen Ansichten, nicht zwischen verschiedenen Methoden in derselben Ansicht. –

+0

Danke @ Alasdair Ich denke, anstatt die Get-Methode zu überschreiben, was passieren kann, ist eine Form-Klasse der vorherigen Klasse hinzuzufügen. Damit es in die Suchmaske eingeht. und wenn die html-Aktion sie an die neue URL weiterleitet, rufen Sie den get-Parameter in der neuen templateview ab. Ich habe versucht, das zu tun, weil meine Hausansicht sauber und ohne Formen sein soll, und ich wollte es so behalten. – user3655574

Antwort

0

Anstatt das Formular Kontext Rendering [ "form"] = Searchform(), umfasst eine Formularklassen in der ersten templateview das Formular für den Benutzer zu machen.

class HomeView(TemplateView, FormView): 
    template_name = "home.html" 
    title = 'Your Dashboard' 
    form_class = SearchForm 

auf dem zweiten templateview, machen einen self.request.GET die Benutzereingabe innerhalb get_context_data Verfahren zu sammeln.

class PollSearchView(TemplateView): 
    template_name = 'polls/polls_search.html' 

    def get_context_data(self, **kwargs): 
     context = super(PollSearchView, self).get_context_data(**kwargs) 
     print self.request.GET 
     return context 

Dadurch wird get_context_data die Benutzereingaben erhalten.