HttpResponse错误Django通用模板

时间:2019-03-21 21:58:39

标签: django listview django-class-based-views

我能够使用在views.py中硬编码的参数来呈现基于类的视图通用ListView模板。

class ResourceSearchView(generic.ListView):
    model = creations
    context_object_name = 'reviews'
    template_name = 'reviews.html'
    query = 'theory'

    # def get(self, request):
    #     if request.GET.get('q'):
    #         query = request.GET.get('q')
    #         print(query)

    queryset = creations.objects.filter(narrative__contains=query).order_by('-post_date')

但是,当通过GET方法(如下)通过表单发送参数时,

class ResourceSearchView(generic.ListView):
    model = creations
    context_object_name = 'reviews'
    template_name = 'reviews.html'
    query = 'theory'

    def get(self, request):
        if request.GET.get('q'):
            query = request.GET.get('q')
            print(query)

    queryset = creations.objects.filter(narrative__contains=query).order_by('-post_date')

我收到此错误

  

视图creations.views.ResourceSearchView没有返回   HttpResponse对象。它返回None。

请注意,已成功检索参数名称q和关联值(使用print(query)确认)。

2 个答案:

答案 0 :(得分:1)

因此,对于Django中的CBV,您必须返回某种有效的响应,解释器可以使用该响应来执行实际的HTTP操作。您的GET方法不返回任何东西,这就是让Django生气的原因。您可以渲染模板或将用户重定向到渲染模板的视图,但是您必须执行某事。 CBV中的一种常见模式是执行以下操作:

return super().get(request, *args, **kwargs)

...这将继续进行一系列的方法调用,这些方法最终将渲染模板或以其他方式处理响应。您也可以直接致电render_to_response(),或者如果您要从该视图继续浏览,请将用户重定向到get_success_url或类似位置。

在这里(http://ccbv.co.uk)可以轻松阅读所有当前Django CBV的布局以及它们支持的方法/变量。

答案 1 :(得分:0)

感谢您的答复。这是一种解决方案。

class ResourceSearchView(generic.ListView):
    model = creations
    context_object_name = 'reviews'
    template_name = 'reviews.html'

    def get_queryset(self):
        query = self.request.GET.get('q')
        queryset = creations.objects.filter(narrative__contains=query).order_by('-post_date')
        return queryset