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 模板和变量属性的主要内容,如果未能解决你的问题,请参考以下文章

你能用其他变量访问 django 模板语言中的变量属性吗?

Django之模板

Django之模板

Django模板系统

Django的模板系统

Django之模板