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模板不显示循环键、值

Django 表单在 html 模板中不起作用,它只是显示按钮

在 django 模板中显示字典索引或键名

将 vue js 应用程序绑定到 django 模板不显示任何内容

08 Django 模板进阶