我正在使用Google App Engine和Django模板。
我有一个想要显示对象的表,如下所示:
1 2 3
| Object Result:
Items = [item1,item2]
Users = [{name='username',item1=3,item2=4},..] |
Django模板为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <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引擎中运行,您需要将文件添加到主目录中,
我叫我的django_hack.py,其中包含这段小代码
1 2 3 4 5 6 7 8 9 10 11
| 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) |
现在我们有了这个文件,我们需要做的就是告诉应用程序引擎使用它...
我们通过在主文件中添加这一行来实现这一目的
1
| webapp.template.register_template_library('django_hack') |
,然后在您的模板视图中添加此模板,而不是通常的代码
它应该完美工作=)
我假设无效的部分是{{ user.item }}。
Django将尝试字典查找,但使用字符串"item"而不是item循环变量的值。 Django将{{ user.name }}解析为user对象的name属性时,执行了相同的操作,而不是查找名为name的变量。
我认为您需要先对视图中的数据进行一些预处理,然后再将其呈现在模板中。
或者您可以使用默认的django系统,该系统用于解析临时模板中的属性,如下所示:
1 2 3 4 5 6 7 8 9
| 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 |
那行得通
在您的模板中:
@Dave Webb(我的评价还不够高,无法发表评论)
点查找可以总结如下:当模板系统遇到变量名称中的点时,它将按以下顺序尝试以下查找:
1 2 3 4
| * 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]) |
系统使用第一个有效的查找类型。 Ita的短路逻辑。
使用Django模板替换Google App Engine上user.items中的k,v,其中user = {'a':1,'b',2,'c',3}
1 2 3
| {% for pair in user.items %}
{% for keyval in pair %} {{ keyval }}{% endfor %}
{% endfor %} |
a 1
b 2
c 3
每个字典项的
pair =(键,值)。
不应该这样:
是这个吗?
该循环中的上下文中没有用户对象....?