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文档指出当它看到一个。在变量中
它尝试几种方法来获取数据,其中之一是字典查找,这正是我想要的,但似乎没有发生...
解决方案
回答
我假设不起作用的部分是{{user.item}}
。
Django将尝试字典查找,但使用字符串" item"而不是item循环变量的值。 Django在将{{user.name}}解析为
user对象的
name属性时做了同样的事情,而不是寻找一个名为
name`的变量。
我认为我们需要先对视图中的数据进行一些预处理,然后再将其呈现在模板中。
回答
不应该这样:
{{ user.item }}
是这个吗
{{ item }}
在该循环内的上下文中没有用户对象。
回答
我找到了一种在内部获取变量的"更好的" /"更好的"解决方案
它不是最好的方法,但是它可以工作。
我们将自定义过滤器安装到django中,该过滤器将dict的键作为参数
要使其在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 }}
它应该可以完美地工作=)
回答
@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中的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
b 2
c 3
对=每个字典项目的(键,值)。
回答
或者,我们可以使用默认的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 }}