如何将forloop.counter连接到我的django模板中的字符串

时间:2011-04-20 05:12:40

标签: python django django-templates for-loop string-concatenation

我已经尝试连接这样:

{% 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号码。有没有人知道发生了什么以及我可以做些什么来解决这个问题?非常感谢!

3 个答案:

答案 0 :(得分:45)

你的问题是forloop.counter是一个整数,并且你正在使用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>
...

带有标记的第二个是必需的,因为stringformat标记是使用自动添加的%实现的。要解决此问题,您可以创建自定义过滤器。我使用类似的东西:

http://djangosnippets.org/snippets/393/

将剪辑保存为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 %}

答案 1 :(得分:3)

您可能不希望在模板中执行此操作,这看起来更像是一个视图作业:(在for循环中使用if)。

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来选择一个不在dictionnary中的数字的模板。 for key,value in dict.items()可能是您正在寻找的。

答案 2 :(得分:3)

使用块“with”

尝试不带的
{% for choice in choice_dict %}
    {% if choice =='2' %}
       {% include "mod"|add:forloop.counter|add:".html" %}                   
    {% endif %}
{% endfor %}