Django 1.11报错TypeError: context必须是dict而非Context,求解决
解决Django 1.11中TypeError: context must be a dict rather than Context的问题
嘿,这个问题我太熟了!一眼就瞅出毛病在你视图函数的最后一行——你直接返回了Restaurant对象r,这完全不是Django视图该返回的东西啊!Django要求视图必须返回HttpResponse(或它的子类)对象,你返回模型实例,Django内部处理时就把它误当成上下文对象了,这才抛出了那个类型错误。
给你两种修复方式,推荐用第一种:
1. 使用推荐的render函数(Django 1.8+首选)
render函数会自动帮你把上下文转换成字典,还会正确包装成RequestContext,直接返回合法的HttpResponse,完美适配Django 1.11。修改后的代码如下:
from django.shortcuts import render from django.utils import timezone # 确保导入该模块 def comment(request, id): if id: r = Restaurant.objects.get(id=id) else: return HttpResponseRedirect("/restaurants_list/") if request.POST: visitor = request.POST['visitor'] content = request.POST['content'] email = request.POST['email'] date_time = timezone.localtime(timezone.now()) # 修正timezone()的错误,应该是timezone.now() Comment.objects.create( visitor=visitor, email=email, content=content, date_time=date_time, restaurant=r ) # 额外建议:POST后重定向,避免用户刷新页面重复提交评论 return HttpResponseRedirect(request.path) # 改成render,传入请求、模板路径和上下文字典 return render(request, 'your_template_name.html', {'restaurant': r})
2. 旧写法(不推荐,仅作参考)
如果你之前习惯用render_to_response,也能修复,但这个方法在Django 1.10之后已经被标记为过时:
from django.shortcuts import render_to_response from django.template import RequestContext from django.utils import timezone def comment(request, id): # ... 前面的代码和上面一致 ... return render_to_response( 'your_template_name.html', {'restaurant': r}, context_instance=RequestContext(request) )
几个额外提醒
- 你原来的
timezone()是错误的,应该用timezone.now()获取当前时间,不然会触发另一个错误。 - 处理POST请求后建议重定向,遵循POST/REDIRECT/GET模式,避免用户刷新页面时重复提交评论。
内容的提问来源于stack exchange,提问作者naturlich
相关产品推荐
相关产品推荐

