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, Context

address = [('张三', '地址一'), ('李四', '地址二') ]

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, Context

address = [('张三', '地址一'), ('李四', '地址二') ]


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

运行代码进行访问,正确执行,弹出下载提示框。





  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值