python - 如何在通用类视图中以 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 格式的数据,有没有更好的方法来实现这一点?
解决方案
我认为您在错误的级别上对其进行了修补。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(..)
函数。但它不会立即返回结果,而是将其包装到呈现的响应中。
推荐阅读
- python - 将列表附加到类对象(python)
- azure-devops - Azure DevOps:获取 Git 存储库的贡献者
- postgresql - 用户 REFERENCE 列的 PostgreSQL 迁移语法错误
- assembly - 需要一些关于汇编语言中内存字节的解释
- angular - 如何根据 har 文件模拟浏览器请求?
- javascript - 如何进行附加输入并将值发送到数组
- python - 在 x 次请求后更改代理
- powerquery - Power Query:用 1 个 id 链接 2 个表并添加一个值
- r - 将行转移到 r 中的列
- python - 如何在 PyQt5 中使 `textEdit.find()` 的选定文本变暗?