Django模板与变量属性
我正在使用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文档上说,当它在变量中看到一个.时,
它会尝试几种方法来获取数据,其中一种就是字典查找,这正是我想要的,但似乎没有成功...
6 个回答
9
或者你可以使用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 }}
10
我猜测你遇到问题的地方是 {{ user.item }}
。
Django 在这里会尝试查找一个字典,但它用的是字符串 "item"
,而不是循环变量 item
的实际值。Django 在处理 {{ user.name }}
时也是这样,它查找的是 user
对象的 name
属性,而不是找一个叫 name
的变量。
我觉得你需要在视图中对数据进行一些预处理,然后再在模板中渲染出来。
34
我找到了一种“更好”的方法来获取变量。
虽然这不是最完美的方式,但它确实有效。
你需要在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)
现在我们有了这个文件,接下来只需要告诉App Engine使用它……
我们通过在主文件中添加这一行来实现:
webapp.template.register_template_library('django_hack')
然后在你的模板视图中,使用这个模板替代通常的代码:
{{ user|hash:item }}
这样应该就能完美运行了 =)