首页 > 解决方案 > 如何在通用类视图中以 Json 格式发送 HTTP 响应 [Django]

问题描述

我在 Generic DetialView 类中进行了子分类,views.py并试图根据 url 中收到的参数找出一种以 JSON 格式返回数据的方法。这是我尝试做的...

# views.py
from django.views.generic import DetailView
from django.http import JsonResponse    

class ExtendedView(DetailView):
    context_object_name = 'post'
    model = StorageModel
    template_name='posts.html'

    def get_context_data(self, **kwargs):
        data = super(HacksViewPost, self).get_context_data(**kwargs)
        if bool(self.request.GET):
            data__ = JsonForm(request.GET)
            if data__.is_valid():
                json = data__.cleaned_data['json']
                if json == 'true':
                    return JsonResponse({'data': 'data'})
        return data

但这给了我TypeError应有的:

TypeError at /category/extended-slug/
context must be a dict rather than JsonResponse.

激活ExtendedView类的 url 是:

/category/extended-slug?json=true

所以,问题是我如何从通用视图类发送 JSON 格式的数据,有没有更好的方法来实现这一点?

标签: pythondjangodjango-views

解决方案


我认为您在错误的级别上对其进行了修补。get_context_data函数使用来get渲染它。结果,get_context_data对象无法控制对结果的处理,以便构造服务器响应,

但是,您可以修补该get(..)功能,例如:

class ExtendedView(DetailView):

    """A base view for displaying a single object."""
    def get(self, request, *args, **kwargs):
        self.object = self.get_object()
        data = self.get_context_data(object=self.object)
        if self.request.GET:
            data__ = JsonForm(request.GET)
            if data__.is_valid():
                json = data__.cleaned_data['json']
                if json == 'true':
                    return JsonResponse({'data': data})
        return self.render_to_response(data)

post,put和其他请求也是如此。

如果我们看一下DetailView源代码,我们会看到:

class BaseDetailView(SingleObjectMixin, View):
    """A base view for displaying a single object."""
    def get(self, request, *args, **kwargs):
        self.object = self.get_object()
        context = self.get_context_data(object=self.object)
        return self.render_to_response(context)

因此get(..)调用get_context_data(..)函数。但它不会立即返回结果,而是将其包装到呈现的响应中。


推荐阅读