2013-03-11 107 views
-1

这是我认为会工作: 我有一个字典索引的游戏和包含gameSlots 确认:{{gameSlot.game.name}}是有效的(和其他gameSlot.game .X性能也精) 证实:assignedGameSlotsInMyGames有人拿着{游戏:[gameSlot1,gameSlot1]} 但是:{%用于gameSlot2在assignedGameSlotsInMyGames [gameSlot.game]%}没有迭代Python(2.7)字典Jinja混淆

我做明显的错误? (如果需要,我可以发布更完整的代码 - 我用一个非常丑陋的替代方法替换了代码,但很乐意将它带回来显示测试结果等)。

更多细节添加....
数据是: assignedGameSlotsInMyGames包含一个游戏(名为“后来”),其中有两个赋予的gameSlots。

解决方法打印这些gameSlots的内容:

{% for game, gameSlots in assignedGameSlotsInMyGames.iteritems() %} 
    {% if gameSlot.game.name == game.name %} 
    {% for gameSlot2 in gameSlots %} 
     <tr> 
     <td> {{gameSlot2.user.email}} </td> 
     <td> {{gameSlot2.gameCharacter.characterType}} </td> 
     </tr> 
    {% endfor %} 
    {% endif %} 
{% endfor %} 

附加说明:原因有:

if gameSlot.game.name == game.name 

的是,我通过属于特定的所有gameSlots迭代用户。当我显示那个gameSlot时,我想包含关于该gameSlot引用的游戏的其他信息。由于我直接引用该游戏的尝试(下文)无效,因此我循环遍历所有游戏并使用与“外部循环”中当前游戏相匹配的游戏(跛脚,是 - 这就是为什么我发布该问题的原因)。注意:对于我正在测试的示例,只有一个名称为“Later”的游戏。

有一个外部循环遍历所有gameSlot.games - 唯一的迭代是当gameSlot.game.name ==“Later”时。而所有这些额外的循环,我想我可以使用:

{% for gameSlot2 in assignedGameSlotsInMyGames[gameSlot.game] %} 
    <tr><td>Iteration</td></tr> 
{% endfor %} 

我在想,既然assignedGameSlotsInMyGames是一个游戏对象与被gameSlots值索引的字典,这应该工作。但是没有迭代打印。的

调试代码:

<tr><td colspan="6">TestCode - gameSlot.game = {{gameSlot.game}}, assignedGameSlotsInMyGames[gameSlot.game] = {{assignedGameSlotsInMyGames[gameSlot.game]}} </td></tr> 
<tr><td colspan="6">TestCode - gameSlot.game.name = {{gameSlot.game.name}}, assignedGameSlotsInMyGames = {{assignedGameSlotsInMyGames}}</td></tr> 
<tr><td colspan="6">Test from Ellochka - assignedGameSlotsInMyGames.game = {{assignedGameSlotsInMyGames.game}}</td></tr> 

具有输出:

TestCode - gameSlot.game = , assignedGameSlotsInMyGames[gameSlot.game] = 
TestCode - gameSlot.game.name = Later, assignedGameSlotsInMyGames = {: [, ]} 
Test from Ellochka - assignedGameSlotsInMyGames.game = 

这是我与Jinja2的模板(和Python),所以我可能会很困惑第一次经历。

回答

0
from jinja2 import Template 

ts = """ 
{% for game, gameSlots in assignedGameSlotsInMyGames.iteritems() %} 
{% for gameSlot2 in gameSlots %} 
<tr> 
<td> {{gameSlot2.user.email}} </td> 
<td> {{gameSlot2.gameCharacter.characterType}} </td> 
</tr> 
{% endfor %} 
{% endfor %} 
""" 

t = Template(ts) 

d = {'assignedGameSlotsInMyGames': 
    {'game1': [{'user': {'email': '[email protected]'}, 
       'gameCharacter':{'characterType':'testCharacterType1'}}, 
       {'user': {'email': '[email protected]'}, 
       'gameCharacter':{'characterType':'testCharacterType2'}}], 
     'game2': [{'user': {'email': '[email protected]'}, 
       'gameCharacter':{'characterType':'testCharacterType12'}}, 
       {'user': {'email': '[email protected]'}, 
       'gameCharacter':{'characterType':'testCharacterType22'}}] 
    } 
} 

print t.render(d) 

输出是:

<tr> 
<td> [email protected] </td> 
<td> testCharacterType12 </td> 
</tr> 

<tr> 
<td> [email protected] </td> 
<td> testCharacterType22 </td> 
</tr> 



<tr> 
<td> [email protected] </td> 
<td> testCharacterType1 </td> 
</tr> 

<tr> 
<td> [email protected] </td> 
<td> testCharacterType2 </td> 
</tr> 

在您的模板,我不明白什么是{% if gameSlot.game.name == game.name %}。 你单独传递关键gameSlot还是仅仅是一个错字,你打算写gameSlots?

对于一个非常明确的答案,你可以写出你传递给渲染函数(或类似的)的字典结构(例子),并且我会告诉错误的位置,如果仍然不清楚的话。

修订

ts = """ 
{% for g in games %} 
    {% for v in ags[g.game]%} 
     {{ v }} 
    {% endfor %} 
{% endfor %} 
""" 

d = { 
     'games':[{'game':'A'}, 
      {'game':'B'}, 
      {'game':'C'}], 
     'ags':{'A':['ONE','TWO','THREE'],'B':['1','2','3']} 
} 

t = Template(ts) 
print t.render(d) 

输出:

ONE 

TWO 

THREE 



1 

2 

3 

我可以建议你将数据传递给uncorrectly功能和不当处理它们的唯一的事情。请参阅documentation

+0

我试过,但它也没有迭代。我认为,既然assignedGameSlotsInMyGames是一个字典,我需要使用[]语法。上面还提供了有关代码的更多细节。谢谢! – 2013-03-11 20:10:04

+0

@ RichardBerger,我纠正了我的答案。 – 2013-03-12 17:07:45

+0

感谢您的额外信息。我在附加说明中回答了您的问题(添加到原文中)。即使gameSlot.game在assignedGameSlotsInMyGame字典中有一个有效的游戏,那么不工作的部分是{%for assignedGameSlotsInMyGames [gameSlot.game]%}中的gameSlot2。也许我对Jinja2期待太多? – 2013-03-12 20:48:54