Sha*_*hif 3 python django django-views
我已经对 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
Run Code Online (Sandbox Code Playgroud)
但这给了我TypeError应该的:
TypeError at /category/extended-slug/
context must be a dict rather than JsonResponse.
Run Code Online (Sandbox Code Playgroud)
激活ExtendedView类的 url是:
/category/extended-slug?json=true
Run Code Online (Sandbox Code Playgroud)
所以,问题是我如何从通用视图类以 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)Run Code Online (Sandbox Code Playgroud)
这同样适用于post,put以及其他请求。
如果我们看一下DetailView源代码,我们会看到:
Run Code Online (Sandbox Code Playgroud)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(..)函数。但它并没有立即返回结果,它包装成一个渲染响应。
| 归档时间: |
|
| 查看次数: |
5124 次 |
| 最近记录: |