【问题标题】:How to return JsonResponse in Django generic ListView如何在 Django 通用 ListView 中返回 JsonResponse
【发布时间】:2017-02-07 16:23:50
【问题描述】:

我在我的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 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 位于 /si/survey/123456789/ajax-question-list/ 异常值:视图 myapp.views.survey.AjaxQuestionList 没有返回 HttpResponse 对象。它返回 None 。

CBV flattened index 我只是假设render_to_response()get() 之后自动调用,呈现任何HttpResponse get() 返回。我弄错了吗?

【问题讨论】:

  • 请显示堆栈跟踪,您显示的代码不应产生该错误
  • 另外请显示完整的视图类。
  • 添加了类和回溯!
  • 请注意,render_to_response get() 调用,而不是在之后。由于您已覆盖 get(),因此不会调用 render_to_response。但是,这在您的情况下是可以的,因为您想返回 json 而不是渲染模板。

标签: django


【解决方案1】:

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

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

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

【讨论】:

  • 哭泣。过去半小时我一直盯着这段代码想知道它是什么,一直以来我都忘记了return。谢谢阿拉斯代尔。
猜你喜欢
  • 1970-01-01
  • 2021-03-19
  • 2017-12-24
  • 2014-10-16
  • 1970-01-01
  • 1970-01-01
  • 2017-01-29
  • 2021-03-03
  • 2021-11-26
相关资源
最近更新 更多