Django 模板无法访问字典查找变量。我在代码中犯了啥错误?

Posted

技术标签:

【中文标题】Django 模板无法访问字典查找变量。我在代码中犯了啥错误?【英文标题】:Django template unable to access a dictionary lookup variable. What mistake am I doing in code?Django 模板无法访问字典查找变量。我在代码中犯了什么错误? 【发布时间】:2013-08-05 10:26:21 【问题描述】:

我正在 djangobook.com 学习 django

作为练习,我正在尝试使用模板以表格的形式打印所有 HttpRequest.META 字典。

views.py 包含

# Create your views here.
from django.http import HttpResponse
from django.shortcuts import render

def http_headers(request):
    return render(request,'headers.html','headers':request.META)

headers.html

<html><body><table border="1">
% for k in headers.keys %
<tr><td>  k  </td><td> headers.k </td></tr>
% endfor %
</table></body></html>

输出:

<html><body><table border="1">

<tr><td> TMP </td><td></td></tr>

<tr><td> COMPUTERNAME </td><td></td></tr>

<tr><td> wsgi.multiprocess </td><td></td></tr>

<tr><td> RUN_MAIN </td><td></td></tr>

<tr><td> HTTP_COOKIE </td><td></td></tr>
...
...

问题: 为什么无法访问headers.k

djangobook.com 说:

点查找可以这样概括:当模板系统 在变量名中遇到一个点,它会尝试以下查找, 按此顺序:

Dictionary lookup (e.g., foo["bar"])
Attribute lookup (e.g., foo.bar)
Method call (e.g., foo.bar())
List-index lookup (e.g., foo[2])

因此,headers.k 必须首先匹配 字典查找,因为 headers 是字典。对吧?

我错过了什么

【问题讨论】:

【参考方案1】:

headers 是一个字典,您应该使用items (docs) 对其进行迭代:

% for key, value in headers.items %
    <tr><td>  key  </td><td> value </td></tr>
% endfor %

你的错误在于使用 headers.k ,基本上是headers['k'] - request.META 没有k 键 - 这就是你什么都看不到的原因。

希望对您有所帮助。

【讨论】:

不是先评估k的值再使用吗? 不,将k 替换为HTTP_COOKIE,您将看到值。在这种情况下,k 被解释为字符串。不过,如果您使用 k - 您将看到循环变量k 的值。这有点令人困惑,我明白。 另见此帖:***.com/questions/2894365/…

以上是关于Django 模板无法访问字典查找变量。我在代码中犯了啥错误?的主要内容,如果未能解决你的问题,请参考以下文章

Django模板如何用一个变量查找字典值

Django 模板变量和 Javascript

Django 模板变量和 Javascript

Django 模板变量和 Javascript

Django 模板变量和 Javascript

Django 模板变量和 Javascript