Django 字典对象在模板中不显示任何内容,但打印到控制台
Posted
技术标签:
【中文标题】Django 字典对象在模板中不显示任何内容,但打印到控制台【英文标题】:Django dictionary object shows nothing in template but prints to console 【发布时间】:2014-12-02 08:07:00 【问题描述】:按照 Django 的教程 https://docs.djangoproject.com/en/1.6/topics/db/sql/#executing-custom-sql-directly 我调用了一个存储过程并填充了一个字典对象。
Views.py
@login_required
def team_edit(request):
user_instance = request.user
user_id = user_instance.id
cursor = connection.cursor()
cursor.execute("CALL test(%s)", user_id) #Call db stored procedure
results = dictfetchall(cursor)
print(results)
return render_to_response('team_edit.html',results, context_instance=RequestContext(request))
# Converts a list to a dict
def dictfetchall(cursor):
"Returns all rows from a cursor as a dict"
desc = cursor.description
return [
dict(zip([col[0] for col in desc], row))
for row in cursor.fetchall()
]
打印print(results)
在控制台中显示:
['private_league_name': "Root's League", 'host_user_id': 1, 'private_league_name': "Joe's League", 'host_user_id': 3]
但是模板中的列表显示什么都没有:
<h2>Results Test</h2><br>
<ul>
% for key, value in results.items %
<li> key : value </li>
% endfor %
</ul>
这是为什么?
【问题讨论】:
基于document,您必须将dictionary
作为第二个参数传递
【参考方案1】:
您在调用render_to_response
时误解了字典的用途。如果我打电话给
return render_to_response('team_edit.html','customer_id' : 5, context_instance=RequestContext(request))
我将能够有效地使用
customer_id
在我的模板中。
在这种情况下,你想要
return render_to_response('team_edit.html','results' : results, context_instance=RequestContext(request))
但是,请注意您的results
变量是一个列表,而不是一个字典,因此在您的模板中您需要类似
% for result in results %
% for key, value in result %
...
【讨论】:
谢谢。为什么results
仍然是一个列表?我以为它被转换了? ://
@Matchday 一般的想法是在render_to_response
字典中,你有'context_variable_name' : actual_variable_in_controller
。在这种情况下,控制器中的 results
变量确实是一个字典列表。没有隐式转换。
我理解,但在 Django 文档中,我认为 dictfetchall(cursor)
应该将列表转换为 dict 对象
@Matchday dictfetchall
的意图是每行创建字典,而不是结果中的所有行。所以直观地你有一个字典列表,每个字典对应一行。您不能拥有一本字典,因为每个字典只能拥有一个唯一键。注意fetchall()
通常返回元组。【参考方案2】:
像这样在view.py
中更改return
行:
return render_to_response('team_edit.html','results':results, context_instance=RequestContext(request))
【讨论】:
以上是关于Django 字典对象在模板中不显示任何内容,但打印到控制台的主要内容,如果未能解决你的问题,请参考以下文章
使用点运算符访问字典时条件语句在 Django 模板中不起作用
Django 表单在 html 模板中不起作用,它只是显示按钮