2013-08-12 59 views
2

我現在在轉換所有我的Django的基於函數的-意見中的基於類的視圖的過程...在基於類的視圖中,Django FBV的「render_to_response」等效嗎?

所以這是我原來的代碼:

views.py

def search(request):   
    if 'q' in request.GET: 
     q = request.GET['q'] 

     if q: 
      result = Post.objects.filter(title__icontains=q) 

    variables = RequestContext(request, { 
     'result': result 
    }) 

    return render_to_response('search.html', variables) 

我只是想這個切換到CBV只是爲了練習CBV的目的...

這是我到目前爲止有:

views.py

class PostSearch(TemplateView): 
    template_name = 'search.html' 

    def get(self, request, *args, **kwargs): 
     q = self.request.GET.get('q') 
     if q: 
      data = { 
       'result': Post.objects.filter(title__icontains=q) 
      } 

      return self.render_to_response(data) 

我認爲這會工作得很好,因爲它是一個非常簡單的代碼。不過,我得到這個錯誤:

ValueError: The view app_blog.views.PostSearch didn't return an HttpResponse object. 

所以我想「選擇render_to_response」工作在CBV完全不同......

什麼是我原來的代碼轉換爲CBV的正確方法?

感謝:(((

+0

我想'render_to_response'貶值和舊格式使用'render'代替 – suhailvs

回答

2
from django.shortcuts import render 
from django.http import HttpResponse 
class PostSearch(TemplateView): 
    template_name = 'search.html' 
    def get(self, request, *args, **kwargs): 
     q = request.GET.get('q') 
     if q: 
      data = { 
       'result': Post.objects.filter(title__icontains=q) 
      } 

      return render(request,self.template_name,data) 
     return HttpResponse('Please type a search query') 
8
class PostSearch(TemplateView): 
    template_name = 'search.html' 

    def get_context_data(self, **kwargs): 
     context = super(PostSearch, self).get_context_data(**kwargs) 
     q = self.request.GET.get('q') 
     if q: 
      context['result'] = Post.objects.filter(title__icontains=q) 
     return context 
+2

+1用於覆蓋'get_context_data'而不是'GET',但你不。 '定義'q' ... –

+0

謝謝,但爲什麼重寫「get_context_data」比重寫「get」更好?是否有什麼特別的原因??? – user2492270

+1

是的,因爲你需要添加東西到上下文中,那就是這個功能是做什麼的。 –