2012-12-12 24 views
0

我有一个Python对象,它是容器子类的一个实例。因此,该对象x的行为可能与x['name']相似。这个对象也有方法,说x.bar()从Django模板访问容器的方法

如何从Django模板中调用x.bar?首先将模板x.bar评估为x['bar'],这会给出None

我能想到的最好的方法是创建一个对象阴影x,即没有getitem。但我不能delattr__getitem__

有什么更好的点子?在上下文或模板标签中手动传递这些调用的结果的缺点。

谢谢。

+0

我想我可以创建一个代理类并使用__getattr__来调用对象中的方法。 – Overclocked

回答

1

这是Django模板进行表达式评估的基本缺陷。查看模板标签{% expr -arbitrary-python-expression- %}以获得解决方法。例如。 {% expr x.bar(1,2,3) as snort %}在当前上下文中为您提供了一个名为snort的新变量。

或者,您可以尝试Jinja2模板。他们非常接近Django的,但他们允许完整的Python。

注意:Jinja2是而不是与Django的模板系统相同,如果您使用的是任何依赖于模板系统的嵌入页面的django应用程序,这可能会打破它们。对于{% expr %}标签,这不是真的。

+0

我不是模板中泛型python表达式的粉丝,但我明白你的意思。这可能是唯一的选择。 – Overclocked

+0

@超频:我们非常保守地使用'expr';大部分在缓存大*格式数据的模板区域。如果缓存已过期(信息在视图中不可用),那么我们会使数据获取发生在模板内部。这为我们解决了重大的性能问题。我们试图通过一个curried函数,但这个错误多年来一直没有解决;最后修复为1.3([#7153](https://code.djangoproject.com/ticket/7153))。 –