首页 文章

如何在Django泛型ListView中返回JsonResponse

提问于
浏览
0

我在 ListView 中返回有效的 HttpResponse 时遇到了麻烦(我得到的是 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)

我已经检查过 querysetdataJsonResponse 不是 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.响应= get_response(请求)文件“/webapps/escher/lib/python3.5 /site-packages/django/core/handlers/base.py“in _legacy_get_response 249. response = self._get_response(request)File”/webapps/escher/lib/python3.5/site-packages/django/core/handlers/ base.py“在_get_response 198.”中返回None . “ %(callback.module,view_name)异常类型:ValueError at / si / survey / 123456789 / ajax-question-list / Exception Value:视图myapp.views.survey.AjaxQuestionList未返回HttpResponse对象 . 它返回了None .

CBV flattened index我只是假设在 get() 之后自动调用了 render_to_response() ,渲染了返回的HttpResponse get() . 我错了吗?

1 回答

  • 3

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

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

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

相关问题