2009-11-13 197 views
2

有没有办法在Django模板中进行如下操作?使用带空格的键

{% for hop in hops%} 
    <tr> 
     <td>{{ hop.name }}</td> 
     <td>{{ hop.mass }}</td> 
     <td>{{ hop."boil time" }}</td> 
    </tr> 
    {% endfor %} 

跳跃“煮沸时间”不起作用。简单的解决方案是重命名关键boil_time,但我对替代品感兴趣。

回答

1

得到它的最好办法是在属性名潜入另一个变量,就像这样:

{% for key, value in hop.items %} 
    {% ifequal key 'boil time' %} 
     {{ value }} 
    {% endifequal %} 
{% endfor %} 

在Django的0.96模板语言不支持元组(由谷歌AppEngine上使用的版本)扩张,所以这是一个有点丑陋:

{% for hop in hops %} 
    <tr> 
     <td>{{ hop.name }}</td> 
     <td>{{ hop.mass }}</td> 
     <td> 
      {% for item in hop.items %} 
       {% ifequal item.0 'boil time' %} 
        {{ item.1 }} 
       {% endifequal %} 
      {% endfor %} 
     </td> 
    </tr> 
{% endfor %} 

所以,把你的代码中,我们最终得到:

{% for hop in hops %} 
    <tr> 
     <td>{{ hop.name }}</td> 
     <td>{{ hop.mass }}</td> 
     <td> 
      {% for key, value in hop.items %} 
       {% ifequal key 'boil time' %} 
        {{ value }} 
       {% endifequal %} 
      {% endfor %} 
     </td> 
    </tr> 
{% endfor %} 

在Django的0.96(在谷歌AppEnginge版本),这将成为:

{% for hop in hops %} 
    <tr> 
     <td>{{ hop.name }}</td> 
     <td>{{ hop.mass }}</td> 
     <td> 
      {% for item in hop.items %} 
       {% ifequal item.0 'boil time' %} 
        {{ item.1 }} 
       {% endifequal %} 
      {% endfor %} 
     </td> 
    </tr> 
{% endfor %} 

甚至还有一个wordier方式来获得它,使用重新组合标签:

{% regroup hop.items by 'boil time' as bt %} 
    {% for item in bt %} 
     {% if forloop.first %} 
      {% for item2 in item.list %} 
       {% for item3 in item2 %} 
        {% if not forloop.first %} 
         {{ item3 }} 
        {% endif %} 
       {% endfor %} 
      {% endfor %} 
     {% endif %} 
{% endfor %} 
+1

Django模板语言不允许这样做。相当于'hop ['boil time']'的模板语言将会是'hop.boil time'(我认为这是他所面临的问题)。 – 2009-11-13 02:11:06

+1

下面是我上面提出的评论的一个参考文献,它显示'.'表示法包含索引... http://docs.djangoproject.com/en/dev/ref/templates/api/#rendering-a-context – 2009-11-13 02:11:54

+0

I欣赏写出所有代码的努力,但出于某种原因,它似乎不适用于我,复制和粘贴事件。我无法迭代字典来打印任何键或值,即使没有ifequals。 – 2009-11-14 01:36:26

1

你可以使用一个get从djangosnippets过滤:http://www.djangosnippets.org/snippets/1412/

(重命名的关键可能是更好的...)

+0

我会给你一个机会,让你知道它是怎么回事。 – 2009-11-13 02:16:42

+1

男人,我一直在做太多的Ruby。我的倾向是monkeypatch'dict'将下划线转换为空格... – 2009-11-13 02:56:59

+0

我可能应该提到我在google appengine中使用django模板,而不是完整的django应用程序。似乎没有一种简单的方法来添加过滤器。 – 2009-11-14 01:34:35

0

Django的0.96,这是什么GOOGL e Appengine用于模板,以下工作:

{% for hop in recipe.get_hops %} 
    {% for item in hop.items %} 
      {% ifequal item.0 'boil time' %} 
       <p>{{ item.1 }}</p> 
      {% endifequal %} 
     {% endfor %} 
    {% endfor %} 

item.0是关键,item.1是值。 Link.