根据简单的计算从视图触发Mako命令

时间:2012-06-24 14:27:45

标签: python python-2.7 pyramid

我的继承模板中有 n个def块,它在继承的模板中显示其中一个,具体取决于从视图传递的变量值。< / p>

目前,我在View文件中进行计算,然后确定哪个def可见,然后将其作为键值与字典中的其他待显示数据一起传递给继承模板,在那里,使用 if-elif-endif 子句评估此键的值,以查看要显示的def,然后使用 **${self.val_of_key_nn()}**

手动调用该def

我想知道是否有办法摆脱这个if-elif-endif bock并直接从视图中将 self.def_to_call() 命令传递给模板?

示例代码:

#defs is a key in the passed-dictionary.
#I want to reduce this block to a single-line code
% if defs == '1':  
${self.block_1()}
% elif defs == '2':
${self.block_2()}
% else:
${self.block_default()}
% endif

谢谢。

2 个答案:

答案 0 :(得分:3)

菲尔,你的问题是最及时的......截至2012年6月,他们正在努力使这种能力更加明确地用于未来的金字塔版本。

目前有一种方法可以做到这一点,但它没有记录,如果你使用它,你应该考虑将来可能发生变化。而不是只从你的视图中返回一个可调用的dict,返回一个元组: ('defname', {...})其中'defname'是您要呈现的特定def的(引用)名称,{...}是通常的dict。

如果您对提议的未来方法感兴趣,那么将defname放在模板路径(资产规范)中:

https://github.com/Pylons/pyramid/commit/ea009a6d4a1ffa8585faa85581848f6e74a57dfc

对于其他感兴趣的读者,仅供参考:在zzzeek的博客here上有一篇关于此技术用例的优秀文章。

答案 1 :(得分:0)

例如:

<%
    defdict = {'1': block_1, '2': block_2}
%>

${defdict.get(defs, block_default)()}