这是我的看法。我试图简单地显示一个包含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...
答案 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 %}