/ Python

Django 1.7 render() 函数传递 request 对象导致 Value Error

升级到 Django 1.7之后发现打开任何页面都会出现 Value Error。

分析调用栈后发现,导致错误的原因是 render() 函数:

def index(request):
	context = RequestContext(request, {})
	return render(request, 'index.html', context)  # 这一行第三个参数导致 Value Error

Django 1.7 中的 render() 函数会自动将RequestContext加入到上下文中,因此,没有必要不能再将 RequestContext 作为参数传入 render() 函数。

虽然上面代码中 render() 的写法来自于 Django 官方文档中的例子,但实际上,就算在1.6版本中这种写法也是没有必要的(第一个参数已经是 request,第三个参数 context 中又传入了一次 request),只是不会直接导致错误。

解决这个问题的方法有:

  1. 使用关键字参数 context_instancereturn render(request, 'index.html', context_instance=context)
  2. 传入一个字典,而不是 RequestConetxt 对象:return render(request, 'index.html', {'mar_var': 'my_value'})

这一改变在文档中并没有做出任何说明,1.61.7 版本的文档中关于 render() 函数的部分完全一样。谁说 Django 的文档质量高来着?

参考

Value Error After Upgrading Django from 1.6 to 1.7