【问题标题】:django - how to add counter into {{ }} tag through a template for loopdjango - 如何通过循环模板将计数器添加到 {{ }} 标记中
【发布时间】:2016-08-11 13:23:27
【问题描述】:

views.py:

def main(request):
    users = PUser.objects.filter(ostan=os, shahr=sh, content_id=content)
    return render(request, 'main.html', {'users': users})

在 main.html 文件中:

<a href="#">{{ users.0.website }}</a>
.
.
.
<a href="#">{{ users.1.website }}</a>
.
.
.
<a href="#">{{ users.2.website }}</a>
.
.
.
<a href="#">{{ users.3.website }}</a>

现在我想让它通过一个 for 循环。所以我添加了这一行:

numbers = [1, 2, 3, 4]

到views.py,并像这样编辑main.html:

{% for each in numbers %}
    <a href="#">{{ users.0.website }}</a>
{% enfor %}

但我不知道如何编辑{{ users.0.website }} 部分!

我试过{{ users.each.website }},但它没有打印任何东西。应该怎么改?

【问题讨论】:

    标签: for-loop django-templates


    【解决方案1】:

    {{ users.each.website }} 所做的是它在名为users 的变量中存储的dict 中搜索string 类型的键"each"。因此,它不是用于查找名为 usersdict 中的值的名为 each 的变量中的值,而是原始值 "each"

    不幸的是,在 Django 的模板语言中没有内置的过滤器来做你想做的事情,但是你可以自己实现一个模板过滤器来达到这个目的。查看this question的答案。

    除此之外:您是否记得让您的变量 numbers 在模板中可用?

    def main(request):
        // ...
        return render(request, 'main.html', {'users': users, 'numbers': numbers})
    

    ... 因为否则循环将根本不会执行,因为模板内的numbersNone。对于您的特殊用例,您也可以只迭代集合本身:

    {% for user in users %}
        <a href="#">{{ user.website }}</a>
    {% enfor %}
    

    要仅显示有限数量的条目,您可以使用 forloop.counter 而不是引入单独的数字列表:

    {% for user in users %}
        {% if forloop.counter <= 4 %}
            <a href="#">{{ user.website }}</a>
        {% endif %}
    {% endfor %}
    

    【讨论】:

    • 是的,我已将'numbers': numbers 添加到代码中,只是忘记在我的问题中提及。这是行不通的。并且需要使用 indexm,因为我只想获取并打印前四个项目。
    • 几个小时后我就可以自己测试了。如果在那之前没有其他人有可行的解决方案,那么不幸的是,我只能想想可能出了什么问题。我猜没有for 循环的部分(例如users.0.website)工作正常?
    • 如果您问{{ users.0.website }}{{ users.1.website }}{{ users.2.website }} 在 for 循环之外是否可以正常工作,答案是肯定的。
    • 直到我回家并可以自己测试 - 我最后将另一个可能有效的解决方案编辑到我的答案中。你也可以试试……它实际上可能比额外的数字列表更干净。 :)
    • 我刚回到家自己试了一下。很抱歉我忽略了这一点,但实际上它为什么不起作用很简单。我在上面编辑了我的答案,因此您至少可以根据需要将其标记为已接受。 :) 10, 20, ... 的问题实际上是另一个问题,所以我将在 cmets 中讨论这个问题:不幸的是,您不能将两个数字与 Django 的默认模板过滤器相乘。如果你想这样做,你可以使用模块django-mathfilters 来编写类似的东西:&lt;div id="gallery{{ forloop.counter|mul:10 }}"&gt;
    猜你喜欢
    • 2011-07-01
    • 2021-07-06
    • 1970-01-01
    • 2017-09-10
    • 2021-05-07
    • 2012-12-01
    • 2013-06-30
    • 2023-03-26
    • 2019-05-23
    相关资源
    最近更新 更多