2017-10-13 1 views
0

J'ai une vue de gabarit qui est censée prendre en charge une recherche soumise par un utilisateur. J'ai l'intention d'utiliser la méthode get pour faire une requête dans le get_context_data afin que je puisse montrer quelques résultats sur le HTML. Malheureusement, mon get_context_data ne fonctionne pas alors que la méthode get et dispatch de mon templateview fonctionne correctement. Get_context_data ne s'exécute pas du tout lorsque l'utilisateur soumet la recherche.Le contexte templateview basé sur une classe n'est pas rendu

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 

J'ai une autre classe qui redirige vers la classe ci-dessus sur la base d'une entrée utilisateur via un formulaire.

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 

Je pense que la forme fonctionne tout à fait bien, pourquoi le get_context_data ne prend pas toutes les informations me déconcerte, et je cherche d'autres moyens de rendre le contexte en fonction de mes résultats de get. Toute indication sur les raisons pour lesquelles cela ne fonctionne pas et sur la façon de s'y prendre sera excellente.

Merci à tous

+2

La méthode 'TemplateView.get' appellera normalement' get_context_data', mais vous l'avez remplacée par une méthode qui appelle 'render' directement. C'est normalement une mauvaise idée de remplacer 'get' et' post' sur les vues génériques basées sur une classe pour cette raison - il est facile de casser une fonctionnalité comme celle-ci, ou vous devez dupliquer le code. – Alasdair

+2

Et dans tous les cas, je ne vois pas pourquoi vous prenez la peine de mettre les données dans la session. Votre méthode 'get_context_data' peut y accéder directement à partir de' self.request.GET'. La session permet de transmettre des données entre des vues, et non entre des méthodes différentes dans la même vue. –

+0

Merci @ Alasdair Je pense qu'au lieu de surcharger la méthode get, ce qui peut arriver est d'ajouter une classe de formulaire à la classe précédente. Alors que cela prendra dans le formulaire de recherche. et lorsque l'action html le pousse vers le nouvel URL, récupérez le paramètre get dans le nouveau templateview. J'essayais de le faire parce que mon homeview est censé être propre sans formulaires et je voulais le garder comme ça. – user3655574

Répondre

0

au lieu de rendre le formulaire en utilisant le contexte [ "form"] = SearchForm(), comprennent un formclass dans la première templateview pour rendre le formulaire pour l'utilisateur.

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

sur la deuxième templateview, faire un self.request.GET pour collecter l'entrée d'utilisateur à l'intérieur de la méthode get_context_data.

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 

Ceci permettra à get_context_data d'obtenir l'entrée de l'utilisateur.