2017-10-13 131 views
0

我有一個模板視圖,應該在用戶提交的搜索。我計劃使用get方法在get_context_data中執行查詢,以便我可以在HTML上顯示一些結果。不幸的是,我的get_context_data不起作用,而我的templateview中的get方法和分派工作正常。當用戶提交搜索時,get_context_data根本不運行。基於類的templateview上下文不呈現

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 

我有另一個類,重定向到上面的類基於通過窗體的用戶輸入。

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 

我覺得形式完全工作正常,爲什麼在任何信息令我感到困惑的get_context_data不走,我尋找替代的方式來渲染基於從得到結果的上下文。任何指導爲什麼這不起作用,以及如何去做這將是很大的。

感謝所有

+2

'TemplateView.get'方法通常會調用'get_context_data',但是您已經用立即調用'render'的方法替換了它。因爲這個原因,在基於泛型類的視圖上重寫'get'和'post'通常是一個壞主意 - 它很容易破壞這樣的功能,或者最終不得不復制代碼。 – Alasdair

+2

而且無論如何,我看不出爲什麼你很難將數據放入會話中。你的'get_context_data'方法可以直接從'self.request.GET'訪問它。該會話用於在視圖之間傳遞數據,而不是在同一視圖中的不同方法之間傳遞數據。 –

+0

Thanks @ Alasdair我認爲不是重寫get方法,而是可能發生的是將表單類添加到以前的類中。這樣它將採用搜索形式。當html動作將它推送到新的url時,在新的templateview中檢索get參數。我試圖做到這一點,因爲我的homeview應該是沒有形式的乾淨,我想保持這種方式。 – user3655574

回答

0

代替使用上下文呈現的形式[「形式」] = SearchForm(),包括在所述第一templateview一個formclass來呈現給用戶的形式。

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

對第二個templateview,做一個self.request.GET來收集用戶輸入裏面的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 

這將使get_context_data獲得用戶輸入。