Django模板中变量后有两个或多个点

0 投票
3 回答
518 浏览
提问于 2025-04-17 02:48

在Django模板中,能不能在一个变量后面加两个(或更多)点呢?比如说,我有一个对象列表,首先想通过列表索引找到一个对象,然后再调用这个对象的方法来获取它的绝对网址,这样做可以吗?

For example:
    {% for entry in myList %}
    {{ entry.0.get_absolute_url }}
    {% endfor %}

这里的0是用来获取列表中的第一个项目,也就是一个对象,然后我想获取它的绝对网址。当我尝试这样做的时候,它并没有报错,但也没有成功。有没有更好的方法来实现我想做的事情呢?

为了更清楚地说明,奇怪的是:

这样做是可以的:

{{ singleObject.get_absolute_url }}

在这种情况下,如果我只尝试 {{ singleObject }},我会得到那个对象的unicode值,比如说: John Smith

但这样做就不行:

{% for object in objectList %}
{{ object.get_absolute_url }}
{% endfor %}

但是在这种情况下,如果我输入 {{ object }},我就不再得到unicode值了。我得到的是: [<Name: John Smith>] (这里的name是模型的名称)

基本上,这个方法在循环外面是可以工作的。有没有什么原因导致这样呢?

3 个回答

0

你在Django模板中做的事情是完全可以的。没有比你现在的方法更好的方式来完成你想做的事情。

0

多个点是完全可以用的。

根据你的评论,entry.0 是不存在的,因为 entry 本身就是列表中的第一个项目,因为你已经在循环遍历 `myList` 了。

直接使用 entry.get_absolute_url 就可以了。

不过,如果你只想打印出第一个条目的网址,那就不需要循环,直接用 myList.0.get_absolute_url 就行了。

更新:

有个来自《实用程序程序员》的小建议:

“选择”并没有坏

在操作系统、编译器,甚至第三方产品或库中,发现bug的机会很少。问题很可能出在应用程序里。

我觉得你可能认为 Django 模板有问题,但其实是你没有正确构建你的列表。不要害怕展示你实际的代码,抽象问题会让我们看不到真正的问题所在。

0

我明白了。我在我的列表中的每个项目周围都加了括号,像这样:

objectList = [['John Smith'], ['Jim Jones'], ['Bill White']]

真是傻我!非常感谢大家的帮助。

撰写回答