37

我正在使用 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 文档指出,当它看到一个. 在变量中
它尝试了几件事来获取数据,其中之一是字典查找,这正是我想要的,但似乎没有发生......

4

6 回答 6

33

我找到了一个“更好”/“更好”的解决方案来获取变量内部它不是最好的方法,但它有效。

您将自定义过滤器安装到 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 }}

它应该完美地工作=)

于 2008-09-08T19:01:24.353 回答
10

我假设不起作用的部分是{{ user.item }}.

Django 将尝试字典查找,但使用字符串"item"而不是item循环变量的值。{{ user.name }}Django 在解析对象的name属性时做了同样的事情user,而不是寻找一个名为name.

我认为您需要先对视图中的数据进行一些预处理,然后再将其呈现在模板中。

于 2008-08-30T14:16:54.223 回答
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 }}
于 2010-08-12T09:36:35.287 回答
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])

系统使用第一个有效的查找类型。这是短路逻辑。

于 2009-08-14T15:45:39.270 回答
2

使用 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 %}

a 1
b 2
c 3

pair = (key, value) 每个字典项。

于 2010-06-27T00:34:47.973 回答
0

这不应该:

{{ user.item }}

是这个吗?

{{ item }}

该循环内的上下文中没有用户对象......?

于 2008-08-31T22:29:14.453 回答