如何在Django泛型ListView中返回JsonResponse

时间:2016-09-29 11:11:18

标签: django

我在HttpResponse中返回有效的ListView时遇到了问题(我得到了ValueError: The view didn't return an HttpResponse object...。我已经覆盖了get,因为我想要返回一个JsonResponse :

def get(self, requets, *args, **kwargs):
    queryset = self.get_queryset()
    data = serializers.serialize("json", queryset)
    return JsonResponse(data, status=200, safe=False)

我检查过querysetdata以及JsonResponse不是None。 更改return语句不起作用:

return HttpResponse(json.dumps(data), content_type="application/json", status=200)

以前,如果我需要覆盖get,我会return render(...),这有效。

那么,为什么我的HttpResponseJsonResponse根据此实例中的错误而不是可接受的HttpResponse? GET请求将是一个ajax请求,我需要提供一些明智的json作为回复。

编辑:全班

from django.core import serializers
from django.http import JsonResponse
@method_decorator(login_required, name='dispatch')
class AjaxQuestionList(ListView):
    """
    Generic ListView for Question objects. Called by front-end app.
    Requires hash url parameter to identify Survey.
    Intended to be called via ajax. Returns serialized json list of Questions.
    """
    http_method_names = ['get',]

    def dispatch(self, request, *args, **kwargs):
        #allow user to call this View if their Client owns the Survey
        self.survey = get_object_or_404(Survey, hash=self.kwargs['hash'])
        up = get_object_or_404(UserProfile, fk_user=self.request.user)
        self.client = up.fk_client
        if self.survey.fk_client != self.client:
            raise Http404
        super(AjaxQuestionList, self).dispatch(request, *args, **kwargs)

    def get_queryset(self):
        return Question.objects.filter(fk_survey=self.survey)

    def get(self, request, *args, **kwargs):
        queryset = self.get_queryset()
        data = serializers.serialize("json", queryset)
        return JsonResponse(data, status=200, safe=False)

回溯:

  

文件   “/webapps/escher/lib/python3.5/site-packages/django/core/handlers/exception.py”   在内心     39. response = get_response(request)

     

文件   “/webapps/escher/lib/python3.5/site-packages/django/core/handlers/base.py”   在_legacy_get_response中     249. response = self._get_response(request)

     

文件   “/webapps/escher/lib/python3.5/site-packages/django/core/handlers/base.py”   在_get_response中     198.“返回无。” %(回调。模块,view_name)

     

异常类型:ValueError at / si / survey / 123456789 / ajax-question-list /   异常值:视图myapp.views.survey.AjaxQuestionList   没有返回一个HttpResponse对象。它改为返回None。

CBV flattened index我假设在render_to_response()之后自动调用了get(),呈现了HttpResponse get()返回的内容。我错了吗?

1 个答案:

答案 0 :(得分:3)

您需要在调度方法中返回super()的结果。

def dispatch(self, request, *args, **kwargs):
    ... 
    return super(AjaxQuestionList, self).dispatch(request, *args, **kwargs)

如果没有return语句,该方法将返回None,以便您收到错误消息。

相关问题