You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:26:00