本文主要是介绍TypeError: context must be a dict rather than Context.,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1 TypeError: context must be a dict rather than Context.
解释:模板渲染中传入的内容只能是字典,不能是Context对象类型。(1.11.4版本)
我的源码:
#_*_coding:utf-8_*_
from django.http import HttpResponse
from django.template import loader, Contextaddress = [('张三', '地址一'), ('李四', '地址二') ]def output(request, filename):response = HttpResponse(content_type='application/ms-excel')response['Content-Disposition'] = 'attachment; filename=%s.xls' % filename# 拿到模板文件创建一个模板对象t = loader.get_template('xls.html')# 把数据生成一个字典集对象c = Context({'data': address,})# 把数据填充到模板,并且写入到response中response.write(t.render(c))return response
源码来源于 Django step by step.
问题主要出在版本上,1.1版本中可以直接传入Context对象,在1.11后只能传入字典,我们打开路径查看一下源码。路径为:
blog/lib/python2.7/site-packages/django/template/django.py, 这里的blog是我的虚拟空间的名称,由于我用的是virtualenv虚拟空间。
正常安装的Mac的路径是/Library/Frameworks/python
.framework
/Versions/2
.7
/lib/python2
.7
/site-packages/django
/template/django.py
我们找到这个方法在template/context.py 文件中
对参数进行了判断,只要不是字典类型就抛出异常。
2 修改代码,直接以字典的形式传入数据。
#_*_coding:utf-8_*_
from django.http import HttpResponse
from django.template import loader, Contextaddress = [('张三', '地址一'), ('李四', '地址二') ]def output(request, filename):response = HttpResponse(content_type='application/ms-excel')response['Content-Disposition'] = 'attachment; filename=%s.xls' % filename# 拿到模板文件创建一个模板对象t = loader.get_template('xls.html')# 把数据填充到模板,并且写入到response中response.write(t.render({'data':address}))return response
运行代码进行访问,正确执行,弹出下载提示框。
这篇关于TypeError: context must be a dict rather than Context.的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!