如何在泛型类视图中以 Json 格式发送 HTTP 响应 [Django]



我在views.py中对Generic DetailView类进行了子类化,并试图找出一种根据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 格式发送数据,是否有更好的方法来实现这一点?

我认为你在错误的级别修补它。get_context_dataget函数用于呈现它。因此,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)

这同样适用于postput和其他请求。

如果我们看一下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(..)函数。但它不会立即返回结果,而是将其包装到呈现的响应中。

不能在get_context_data方法中返回JsonResponseget_context_data方法允许您向模板发送额外的信息(上下文(,并期望返回dict,而不是JsonResponse

如果要返回JsonResponse,请在类的getpost方法中执行此操作。

相关内容

  • 没有找到相关文章

最新更新