我正在尝试编写一个带有任意数量参数的django包含标记:
@register.inclusion_tag('so.html')
def table_field(*args):
fields = []
for arg in args:
fields.append(arg)
return { 'fields': fields, }
但是,当我从django的模板引擎中调用它时:
{% table_field form.hr form.bp form.o2_sat %}
我收到错误:
table_field takes 0 arguments
这是django模板引擎的另一个限制吗?
答案 0 :(得分:3)
从1.2.1开始,您可以将参数传递给包含标记。
以下是我的mod到django投票模板标签
的示例@register.inclusion_tag("voting/vote_form.html", takes_context=True)
def vote_form(context, vote_object, vote_dict, score_dict):
if isinstance(vote_dict, dict):
,模板如下:
{% vote_form bookmark vote_dict score_dict %}
我不喜欢这个是没有办法命名参数,只是把它们整理好,但确实有用。
现在我不太清楚的是,为什么在指定take_context时,父上下文不会与您返回的上下文一起传递以用于呈现包含模板。
你试图使用* args不会起作用,因为传递的args#是针对该函数进行检查的。
答案 1 :(得分:2)
Re:我正在尝试编写一个带有任意数量参数的django包含标记
我认为你应该将视图中的任意数量的参数作为单个参数传递给某种集合。
基于documentation,我认为你应该将一些集合对象从视图传递到模板到包含标记,并将包含标记写为:
@register.inclusion_tag('so.html')
def table_field(args):
return { 'fields': [arg for arg in args], }
然后你的模板看起来像这样:
{% table_field whatever_was_passed_in_from_the_view %}
我认为模板不会做出关于数据选择的演示决策,并且最好在视图中处理该决策。
答案 2 :(得分:1)
我猜你必须编写自己的模板标签。
答案 3 :(得分:1)
当前的开发版本确实为包含标记提供了可变数量的参数。补丁说明如下:
https://code.djangoproject.com/ticket/13956
它将随1.4发布,请参阅release notes。
答案 4 :(得分:0)
这是django的包含标签的另一个限制。目前,在django的trunk版本中,这是无法做到的。