Django:使用变量作为数组索引?

0 投票
2 回答
604 浏览
提问于 2025-04-15 20:07

我正在尝试创建一个模板,用来把一些项目放到一个表格里。

控制器:

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的长度。

我该怎么做呢?

2 个回答

1

我不太确定有没有现成的模板标签或过滤器可以满足你的需求。你可以考虑自己写一个自定义的模板标签或过滤器,它可以接收一个项目列表和当前的标题,然后返回查找后的值。你可以看看这个链接:http://docs.djangoproject.com/en/dev/howto/custom-template-tags/

2

你可以调整视图来做到:

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代码里,或者说在模板和视图中各分一部分。这样可以简化模板,让它变得更通用,正如你所希望的那样。

撰写回答