Django - 我在这个简单的视图中犯的错误是什么?

时间:2012-01-13 23:08:09

标签: django django-templates django-views

这是我的看法。我试图简单地显示一个包含http元数据的表。

def display_request_meta_data(request):
    meta_data = request.META.items()
    meta_data.sort()
    for x, y in meta_data:  # output of this loop pasted below
        print x, y
    t = get_template('http_meta_data_table.html')
    html = t.render(Context(meta_data)) # I don't understand how to write this line correctly.
    return HttpResponse(html)

这是http_meta_data_table.html的样子:

<html>
<head>
    <title>HTTP Meta Data</title>
</head>
<body>
    <table>
        {% for key, value in meta_data %}
            <tr><td>{{key}}</td><td>{{value}}</td></tr>
        {% endfor %}
    </table>
</body> 
</html>

打印x,y的循环返回以下内容(截断,因为有一堆):

Apple_PubSub_Socket_Render /tmp/launch-SvFjVB/Render
COLORFGBG 7;0
COMMAND_MODE unix2003
CONTENT_LENGTH 
CONTENT_TYPE text/plain
CSRF_COOKIE de982574e125805e307091fcd3f25d2e
DISPLAY /tmp/launch-d6usP9/org.x:0
DJANGO_SETTINGS_MODULE mysite.settings
EDITOR mate -w
GATEWAY_INTERFACE CGI/1.1
HOME /Users/me
etc...

2 个答案:

答案 0 :(得分:2)

Context需要一个字典,将键映射到值。通过调用items(),您获得了一个元组列表:

[('Apple_PubSub_Socket_Render', '/tmp/launch-SvFjVB/Render'), ...]

即使您将其转换为dict(将失去排序),您仍然无法将其用作上下文,因为模板不知道其中包含哪些键的先验。相反,将meta_data作为值传递到 dict:

html = t.render(Context({'meta_data': meta_data}))

现在在模板中说meta_data会调出与密钥meta_data相关联的值,这是一个列表,因此您的for标记将遍历该列表。

答案 1 :(得分:1)

大多数情况下,我们使用render_to_response,因为它稍微简单一些。

https://docs.djangoproject.com/en/dev/topics/http/shortcuts/#render-to-response

return render_to_response( 'http_meta_data_table.html',
    { 'meta': request.META },
    context_instance=RequestContext(request) )

如果您想分别执行此操作,则需要考虑以下事项:

Context是根据字典构建的。 https://docs.djangoproject.com/en/1.3/ref/templates/api/#playing-with-context-objects

request.META已经是字典了。 https://docs.djangoproject.com/en/1.3/ref/request-response/#django.http.HttpRequest.META

你可以这样做

html = t.render(Context(meta=request.META))

在模板中,您可以使用此

显示它
{% for k in meta %}
    <li><tt>{{k}}</tt> {{meta.k}}</li>
{% endfor %}