Django中的KeyError:模板渲染时出错

5 投票
4 回答
6206 浏览
提问于 2025-04-17 15:29

抱歉,如果我的代码或问题看起来很初级。我正在使用django-pagination做分页,按照这个方式进行操作。但在我的页面上出现了keyError,而且还提到这是在模板渲染时发生的错误。我在这里做错了什么呢?我已经成功安装了分页功能,并修改了settings.py文件。但我不知道接下来该怎么做。任何帮助都将非常感激。

 <table class="active_table"  summary="active_user">
    <thead>
     <tr><th>Name</th><th>Mobile Number</th><th>Count</th></tr>
    </thead>
    <tbody id="table_content">
     {% load pagination_tags %}
       {% block content %}
         {% autopaginate response_data 5 %}
           {% for b in response_data %}
              <tr class="table_rows"><td>{{ b.name }}</td><td>{{ b.mobile_number }}</td><td>{{ b.count }}</td></tr>
           {% endfor %}
         {% paginate %}
        {% endblock %}
     </tbody>
  </table>

详细的错误追踪信息在这里 http://dpaste.com/919526/

以下是视图代码

views.py

@csrf_exempt

def active_user_table(request, b):
if request.method != "GET":
raise Http404

if (b=='4'):
         cursor = connection.cursor()
         cursor.execute("SELECT core_user.id, name,mobile_number,COUNT(*) as count, created FROM core_user,core_useractivity WHERE core_user.id = core_useractivity.user_id GROUP BY user_id ORDER BY count DESC")
         response_data = dictfetchall(cursor)
         return render_to_response("siteadmin/active_user_table.tmpl",{'response_data':response_data})
elif (b=='3'):
         cursor = connection.cursor()
         cursor.execute("SELECT core_user.id, name, mobile_number, COUNT(*) as count, created FROM core_user, core_useractivity WHERE core_user.id = core_useractivity.user_id AND MONTH(CAST(created as date)) = MONTH(NOW()) AND YEAR(cast(created as date)) = YEAR(NOW()) GROUP BY user_id ORDER BY count DESC")
         response_data = dictfetchall(cursor)
         return render_to_response("siteadmin/active_user_table.tmpl",{'response_data': response_data})
elif (b=='2'):
         cursor = connection.cursor()
         cursor.execute("SELECT core_user.id, name, mobile_number, COUNT(*) as count, created FROM core_user, core_useractivity WHERE core_user.id = core_useractivity.user_id AND DATEDIFF(NOW(), created) <= 7 GROUP BY user_id ORDER BY count DESC")
         response_data = dictfetchall(cursor)
         return render_to_response("siteadmin/active_user_table.tmpl",{'response_data': response_data})
elif (b=='1'):
         cursor = connection.cursor()
         cursor.execute("SELECT core_user.id, name, mobile_number, COUNT(*) as count, created FROM core_user, core_useractivity WHERE core_user.id = core_useractivity.user_id AND DATE(created) = DATE(NOW())")
         response_data = dictfetchall(cursor)
         return render_to_response("siteadmin/active_user_table.tmpl",{'response_data': response_data})
else:
         raise Http404

抱歉,我现在还没有使用django ORM,但我将来会使用的。

4 个回答

1

如果你在使用render快捷方式时遇到了这个错误,只需要在上下文变量中添加{'request': request }就可以了。

context = { ..., 'request':request}
return render(request, 'templatename.html', context)
4

你需要在调用 render_to_response 时添加 context_instance

return render_to_response("siteadmin/active_user_table.tmpl",{'response_data': response_data}, context_instance=RequestContext(request))

或者你可以在你的 settings.py 文件中使用 TEMPLATE_CONTEXT_PROCESSORS 这个元组。把这个字符串 "django.core.context_processors.request" 加入到上下文处理器中,这样每个 RequestContext 都会包含一个叫做 request 的变量。

4

我自己解决了这个问题,但还是要感谢ndpu的帮助,至少让我确认没有其他问题,只是一些设置上的问题。在这个问题中 我在设置django分页时遇到问题。Alasdair提到要把“django.contrib.auth.context_processors.auth”添加到TEMPLATE_CONTEXT_PROCESSORS里。只要添加上这个,我就得到了正确的预期值。

撰写回答