我能够使用在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)确认)。
答案 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