Yon*_*Yon 34 python django google-app-engine
我正在使用Google App Engine和Django模板.
我有一个表,我想显示对象看起来像:
Object Result:
Items = [item1,item2]
Users = [{name='username',item1=3,item2=4},..]
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
现在,Django文档指出,当它看到一个.在变量中
它尝试了几个东西来获取数据,其中一个是字典查找,这正是我想要但似乎没有发生......
Yon*_*Yon 32
我找到了一个"更好"/"更好"的解决方案,用于获取变量,这不是最好的方式,但它的工作原理.
您在django中安装了一个自定义过滤器,它将dict的键作为参数获取
要使它在谷歌应用程序引擎中工作,你需要将文件添加到主目录,我打电话给我的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)
Run Code Online (Sandbox Code Playgroud)
现在我们有了这个文件,我们需要做的就是告诉app-engine使用它...我们通过在你的主文件中添加这一小行来做到这一点
webapp.template.register_template_library('django_hack')
Run Code Online (Sandbox Code Playgroud)
并在模板视图中添加此模板而不是通常的代码
{{ user|hash:item }}
Run Code Online (Sandbox Code Playgroud)
它应该完美地工作=)
Dav*_*ebb 10
我假设那部分不起作用{{ user.item }}
.
Django将尝试字典查找,但使用字符串"item"
而不是item
循环变量的值.Django在解析对象{{ user.name }}
的name
属性时做了同样的事情user
,而不是寻找一个名为的变量name
.
我认为在模板中渲染数据之前,您需要对视图中的数据进行一些预处理.
小智 8
或者您可以使用默认的django系统,该系统用于解析tempaltes中的属性,如下所示:
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
Run Code Online (Sandbox Code Playgroud)
这才有效
在您的模板中:
{{ user|hash:item }}
Run Code Online (Sandbox Code Playgroud)