mustache / pystache:渲染复杂对象

时间:2014-09-13 21:27:31

标签: python mustache pystache

我试图用Mustache绕过复杂的物体。我实际上是使用pystache在Python中,但文档说它与JS版的Mustache兼容。

在小胡子中,如果information是一个简单的字符串,那么一切都很好:{{information}}

例如,Mustache将information的值设为XYZPDQ

如果information是一个复杂的对象,它不起作用:{{information.property1}} - {{information.property2}}什么都不显示。

我希望看到类似这样的内容:I am property 1 - XYZPDQ

还有部分内容。但这似乎是一种疯狂的过度杀伤力。在那种情况下,我想会有这样的设置:

的layout.html

<div>
    {{> information}}
</div>

information.mustache

{{property1}} - {{property2}}

现在,我将为每个属性提供大量的.mustache部分内容。那不是对的。

更新:以下是使用对象的@ trvrm答案的变体,它显示了问题。它适用于字典,但不适用于复杂类型。我们如何用复杂的类型做到这一点?

import pystache

template = u'''
  {{greeting}}
   Property 1 is {{information.property1}}
   Property 2 is {{information.property2}}
'''

class Struct:
  pass

root = Struct()
child = Struct()
setattr(child, "property1", "Bob")
setattr(child, "property2", 42)
setattr(root, "information", child)
setattr(root, "greeting", "Hello")

context = root

print pystache.render(template, context)

的产率:

   Property 1 is 
   Property 2 is 

如果您将最后两行更改为:

context = root.__dict__

print pystache.render(template, context)

然后你明白了:

  Hello
   Property 1 is 
   Property 2 is 

这个例子,加上下面的trvrm的答案,表明pystache似乎更喜欢字典,并且在复杂类型方面遇到麻烦。

1 个答案:

答案 0 :(得分:3)

Pystache在渲染嵌套对象方面没有问题。

import pystache
template = u'''
  {{greeting}}
   Property 1 is {{information.property1}}
   Property 2 is {{information.property2}}
'''

context={
    'greeting':'Hello',
    'information':{
         'property1':'bob',
         'property2':42
    }
}
print pystache.render(template,context)

的产率:

Hello
  Property 1 is bob
  Property 2 is 42

<强>更新

如果我们替换

,可以使上面的例子有效
class Struct():
    pass

class Struct(object):
    pass