如何在我的Django模板中连接forloop.counter和字符串?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (119)
{% for choice in choice_dict %}
    {% if choice =='2' %}
        {% with "mod"|add:forloop.counter|add:".html" as template %}
            {% include template %}
        {% endwith %}                   
    {% endif %}
{% endfor %}    

但出于某种原因,我只得到了“mod.html”,而不是forloop.counter。

提问于
用户回答回答于
chosen_templates=[]
for choice in choice_dict:
  if choice =='2':
    {% with "mod"|add:forloop.counter|add:".html" as template %}
    template_name = "mod%i.html" %index
    chosen_templates.append(template_name)

然后通过chosen_templates到您的模板,在那里您将只有

{% for template in chosen_templates %}
  {% load template %}
{% endfor %}

为什么要使用dict来选择不包含在词典中的数字的模板。for key,value in dict.items()也许就是你要找的。

用户回答回答于

你的问题是FORLOG。计数器是一个整数,您正在使用add模板过滤器,如果您传递它的所有字符串或所有整数,但不是混合时,它将运行正常。

解决这个问题的一种方法是:

{% for x in some_list %}
    {% with y=forloop.counter|stringformat:"s" %}
    {% with template="mod"|add:y|add:".html" %}
        <p>{{ template }}</p>
    {% endwith %}
    {% endwith %}
{% endfor %}

其结果是:

<p>mod1.html</p>
<p>mod2.html</p>
<p>mod3.html</p>
<p>mod4.html</p>
<p>mod5.html</p>
<p>mod6.html</p>
...

第二个WITH标记是必需的,因为字符串格式标记是用一个自动前缀实现的。%为了绕过这个问题,您可以创建一个自定义过滤器。我用的是类似的东西:

http://djangosnippets.org/nippers/393/

将snipped保存为some_app/templatetags/some_name.py

from django import template

register = template.Library()

def format(value, arg):
    """
    Alters default filter "stringformat" to not add the % at the front,
    so the variable can be placed anywhere in the string.
    """
    try:
        if value:
            return (unicode(arg)) % value
        else:
            return u''
    except (ValueError, TypeError):
        return u''
register.filter('format', format)

模板:

{% load some_name.py %}

{% for x in some_list %}
    {% with template=forloop.counter|format:"mod%s.html" %}
        <p>{{ template }}</p>
    {% endwith %}
{% endfor %}

扫码关注云+社区

领取腾讯云代金券