Джанго - какую ошибку я совершаю в этом простом представлении? - PullRequest
0 голосов
/ 14 января 2012

Вот мой взгляд. Я пытаюсь просто отобразить таблицу с метаданными 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 ]

2 голосов
/ 14 января 2012

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 голос
/ 14 января 2012

В большинстве случаев мы используем 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) )

Если вы хотите сделать это в отдельных шагах, то вам нужнорассмотрим следующее:

Контекст создается из словаря.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 %}
...