Django FBV的"render_to_response"等效于基于类的视图?

use*_*270 2 python django django-class-based-views

我现在正在将所有基于Django函数的视图转换为基于类的视图...

这是我的原始代码:

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)
Run Code Online (Sandbox Code Playgroud)

我只是想把它改成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)
Run Code Online (Sandbox Code Playgroud)

我认为这样可以正常工作,因为它是一个非常简单的代码.但是,我收到此错误:

ValueError: The view app_blog.views.PostSearch didn't return an HttpResponse object.
Run Code Online (Sandbox Code Playgroud)

所以我认为"render_to_response"在CBV中的作用完全不同......

将原始代码转换为CBV的正确方法是什么?

谢谢 :(((

Bur*_*lid 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
Run Code Online (Sandbox Code Playgroud)

  • 覆盖`get_context_data`而不是`get`的+1,但你没有定义`q` ... (2认同)