我试图使模板标签的结果依赖于另一个模板标签。用例如下。我有一个标题列表,其中包含我想要在表格中显示的所有列+他们正在显示的模型列+是否可见。
LIST_HEADERS = (
('Title', 'title', True),
('First Name', 'first_name', True),
('Last Name', 'last_name', True),
('Modified At', 'modified', False),
)
现在我有一个打印出所有标题的模板标签。因此我想创建一个模板标签,打印出表格的主体。因此,我想获取标题列表并检查哪个标题是可见的,并希望相应地显示或隐藏我的值。
因此我在下面创建了模板标签模板:
<tr class="{% cycle odd,even %}">
{% for header in headers %}
{% if header.visible %}
<td><a href="{{ model_instance.get_absolute_url|escape }}">{{ model_instance.title }}</a></td>
{% else %}
<td style="visibility:hidden;"><a href="{{ model_instance.get_absolute_url|escape }}">{{ model_instance.title }}</a></td>
{% endif %}
{% endfor %}
</tr>
你在那里看到了值{{model_instance.title}}。这个值我想在运行时更改为model_instance.title,model_instance.first_name,model_instance.last_name,....
因此我正在寻找一种如何将{{model_instance}}与header.model_column结合起来的方式。
model_column等于LIST_HEADERS中的第二个条目。因此model_column将是title,first_name,..
因此解决方案就像[pseudocode] {{model_instance.header.model_column}} [pseudocode]
..因此我搜索了一种方法,我可以将django模板方法调用与django模板标签属性结合起来......哇......听起来很疯狂:D
我希望我解释得足够好!可能有一个更容易解决我的问题。但这在我看来非常通用和容易,并将工作。
答案 0 :(得分:2)
我会将其作为过滤器,因为它们提供了一种根据变量值呈现结果的简便方法。
@register.filter
def field_from_name(instance, field_name):
return getattr(instance, field_name, None)
然后在模板中:
{{ model_instance|field_from_name:header.model_column }}
答案 1 :(得分:2)
简化这一点。
首先,阅读Django模板语言实际上可以做的事情。这并不多。它可以使用变量,列表和词典。
如果你在视图函数中完成所有“工作”,那就更简单了。
show = [ ]
for title, field_name, visible in LIST_HEADERS:
if visible: style= "visibility:hidden"
else: style= ""
show.append( (style, title, getattr(object,field_name) )
render_to_response( "template", { 'show_list': show, ... }, ... )
在您的模板中
{% for style, name, value in show_list %}
<tr class="{% cycle odd,even %}">
<td class="{{style}}"><a href="...">{{value}}</a></td>
{% endfor %}
的确,我建议从你的视图功能中删除LIST_HEADERS。
show = [
("", 'Title', object.title),
("",'First Name', object.first_name),
("",'Last Name', object.last_name),
("visibility:hidden",'Modified At', object.modified),
]
render_to_response( "template", { 'show_list': show, ... }, ... )
我发现上面的内容更容易使用,因为它是显式的并且在视图函数中。