2012-08-03 27 views
1

我正在制作一个自定义模板标记,并且希望能够以任何类型的值传递它。用例是这样的:django:解决自定义模板中的变量

{% include_with_args "path_to_template.html" simple_var an_object.foo.bar "A String" %} 

在评估我的自定义模板的代码,我要评估simple_varan_object.foo.bar,和"A String",以同样的方式Django的通常会。目前我有

these_args = [context[arg_name] for arg_name in self.arg_names] 

但是,这只适用于变量名称(simple_var)。

如何让我的模板像Django一样评估这些字符串?也就是说,如果.foo是一个返回带有"bar"键的字典的函数,它应该按照预期对其进行评估:an_object.foo()["bar"]

简而言之:我想评估一个表达式的值。我如何从自定义模板中做到这一点?

+2

这可能是我接受我试图在模板中放置太多逻辑,然后回到视图来尝试解决为什么在那里无法完成的问题。 – 2012-08-03 00:28:15

+0

我有一个像'{'Category1':{'Subcat1':obj,'Subcat2':obj},'Category2':{'Subcat1':obj,'Subcat4':obj}}'的属性我传递给模板的对象。每个“obj”都使用另一个模板呈现。所以我想做'{%include_with_args“obj_renderer.html”object.Category1.Subcat1%}','{%include_with_args“obj_renderer.html”object.Category2.Subcat4%}等等...什么是更好的方法? – Claudiu 2012-08-03 02:06:43

回答

2

其实很简单。相反的:

these_args = [context[arg_name] for arg_name in self.arg_names] 

做:

these_args = [template.Variable(arg_name).resolve(context) for arg_name in self.arg_names] 

当然,现在arg_name是用词不当,所以我改变了这一切,但只是写这样阐明的差异。