gpt4 book ai didi

python - 如何在通用类 View 中以 Json 格式发送 HTTP 响应 [Django]

转载 作者:行者123 更新时间:2023-11-28 22:18:27 25 4
gpt4 key购买 nike

我在 views.py 中对 Generic DetialView 类进行了子分类,并试图根据 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

所以,问题是我如何从通用 View 类发送 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()
<b>data =</b> 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':
<b>return JsonResponse({'data': data})</b>
<b>return self.render_to_response(data)</b>

postput 和其他请求也是如此。

如果我们看一下 DetailView source code我们看到:

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

关于python - 如何在通用类 View 中以 Json 格式发送 HTTP 响应 [Django],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50512804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com