Django 模板和变量属性
Posted
技术标签:
【中文标题】Django 模板和变量属性【英文标题】:Django templates and variable attributes 【发布时间】:2010-09-07 08:22:23 【问题描述】:我正在使用 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 documention 声明当它在变量中看到 . 时 它尝试了几件事来获取数据,其中之一是字典查找,这正是我想要的,但似乎没有发生......
【问题讨论】:
这是一个优雅的解决方案:***.com/a/8000091/781695 【参考方案1】:我找到了一个“更好”/“更好”的解决方案来获取内部变量 这不是最好的方法,但它确实有效。
您在 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
它应该可以完美运行 =)
【讨论】:
【参考方案2】:我假设不起作用的部分是 user.item
。
Django 将尝试字典查找,但使用字符串"item"
而不是item
循环变量的值。 Django 在将 user.name
解析为user
对象的name
属性时做了同样的事情,而不是寻找一个名为name
的变量。
我认为您需要先对视图中的数据进行一些预处理,然后再将其呈现到模板中。
【讨论】:
【参考方案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
【讨论】:
我可以吻你【参考方案4】:@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])
系统使用第一个有效的查找类型。这是短路逻辑。
【讨论】:
【参考方案5】:使用 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 b 2 c 3
pair = (key, value) 每个字典项。
【讨论】:
【参考方案6】:不应该这样吗:
user.item
是这个吗?
item
在该循环的上下文中没有用户对象......?
【讨论】:
以上是关于Django 模板和变量属性的主要内容,如果未能解决你的问题,请参考以下文章