【问题标题】:Django: using variables as array indices?Django:使用变量作为数组索引?
【发布时间】:2010-03-07 18:17:52
【问题描述】:

我正在尝试创建一个将项目放入表中的模板。

控制器:

items = Item.all().order('name').fetch(10)

    template_values = {'items': items,
                       'headers': ['Name', 'Price', 'Quantity']}
    render('Views/table.html', self, template_values)

模板:

<table>
    <tr>
    {% for header in headers %}
        <th>{{header}}</th>
    {% endfor %}
    </tr>
    {% for item in items %}
        <tr><td><a href="detail/{{item.CSIN}}">{{item.name}}</a></td><td>{{item.CSIN}}</td></tr>
    {% endfor %}
</table>

现在,模板被硬编码以查找item 的某些属性。我想更改它,以便它查找名称在headers 中的属性,或者查找前n 个属性,其中n 是headers 的长度。

我该怎么做?

【问题讨论】:

  • 嗯,为什么要将模板逻辑(显示哪些列)放在视图中?
  • 它根据header 是什么来选择要显示的列。这允许重复使用模板。在控制器中选择要显示的列,它通过header 值告诉模板。

标签: python django google-app-engine templating


【解决方案1】:

你可以调整视图来做:

items = Item.all().order('name').fetch(10)
headers = ['Name', 'Price', 'Quantity']
viewitems = [[getattr(x, h) for h in headers] for x in items]

template_values = {'items': viewitems,
                   'headers': headers}
render('Views/table.html', self, template_values)

所以模板所要做的就是遍历每个“项目”(这将只是与标题对应的要显示的值的列表。基本上,这将从模板中移动逻辑(决定要显示的内容) (或者实际上在模板和视图中分别拆分一点)完全到视图中的 Python 代码,简化模板并使其更通用,如您所愿。

【讨论】:

  • 您可以懒惰地评估视图项,因为它们可能是数据库查询?
  • 是的,我很确定您可以使用 genexp(圆括号)而不是 listcomp(方括号)作为viewitems 的外部级别。但是使用fetch(10(已经在 OP 的问题中)节省的时间应该是适度的(如果存在的话:10 个数据库查询与单个 10 项查询......)。
【解决方案2】:

我不确定是否有现有的模板标签/过滤器可以满足您的需求。您可以考虑编写一个自定义模板标签或过滤器,它接受项目列表和当前标题并在查找后返回值。看看http://docs.djangoproject.com/en/dev/howto/custom-template-tags/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    • 1970-01-01
    相关资源
    最近更新 更多