Django 模板和变量属性
-
09-06-2019 - |
题
我正在使用 Google App Engine 和 Django 模板。
我有一个表,我想显示对象,如下所示:
Object Result:
Items = [item1,item2]
Users = [{name='username',item1=3,item2=4},..]
Django 模板是:
<table>
<tr align="center">
<th>user</th>
{% for item in result.items %}
<th>{{item}}</th>
{% endfor %}
</tr>
{% for user in result.users %}
<tr align="center">
<td>{{user.name}}</td>
{% for item in result.items %}
<td>{{ user.item }}</td>
{% endfor %}
</tr>
{% endfor %}
</table>
现在 Django 文档 指出当它看到一个 . 在变量中
它尝试了几件事来获取数据,其中之一是字典查找,这正是我想要的,但似乎没有发生......
解决方案
我找到了一个“更好”/“更好”的解决方案,可以在其最佳的方式中获取变量,但可以使用。
您在 django 中安装了一个自定义过滤器,它将您的字典的键作为参数
为了使其在Google App-engine中工作,您需要在主目录中添加一个文件,我叫我 django_hack.py 其中包含这一小段代码
from google.appengine.ext import webapp
register = webapp.template.create_template_register()
def hash(h,key):
if key in h:
return h[key]
else:
return None
register.filter(hash)
现在我们有了这个文件,我们需要做的就是告诉应用程序引擎使用它......我们通过将这一小行添加到您的主文件中来做到这一点
webapp.template.register_template_library('django_hack')
并在模板视图中添加此模板而不是通常的代码
{{ user|hash:item }}
它应该可以完美工作=)
其他提示
我假设不起作用的部分是 {{ user.item }}
.
Django 将尝试字典查找,但使用字符串 "item"
而不是的价值 item
循环变量。当它解决时,Django 做了同样的事情 {{ user.name }}
到 name
的属性 user
对象,而不是寻找一个名为 name
.
我认为在模板中渲染数据之前,您需要对视图中的数据进行一些预处理。
或者您可以使用默认的 django 系统,该系统用于解析模板中的属性,如下所示:
from django.template import Variable, VariableDoesNotExist
@register.filter
def hash(object, attr):
pseudo_context = { 'object' : object }
try:
value = Variable('object.%s' % attr).resolve(pseudo_context)
except VariableDoesNotExist:
value = None
return value
这才有效
在你的模板中:
{{ user|hash:item }}
@Dave Webb(我的评价还不够高,无法发表评论)
点查找可以总结如下:当模板系统在变量名中遇到点时,它会按以下顺序尝试以下查找:
* Dictionary lookup (e.e., foo["bar"])
* Attribute lookup (e.g., foo.bar)
* Method call (e.g., foo.bar())
* List-index lookup (e.g., foo[bar])
系统使用第一个有效的查找类型。这是短路逻辑。
使用 django 模板替换 Google App Engine 上 user.items 中的 k,v,其中 user = {'a':1, 'b', 2, 'c', 3}
{% for pair in user.items %}
{% for keyval in pair %} {{ keyval }}{% endfor %}<br>
{% endfor %}
一个 1
乙2
丙3
每个字典项的pair = (key, value)。
不应该这样:
{{ user.item }}
是这个吗?
{{ item }}
该循环内的上下文中没有用户对象......?