Django模板与变量属性

38 投票
6 回答
30330 浏览
提问于 2025-04-11 09:17

我正在使用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 }}

这样应该就能完美运行了 =)

撰写回答