django templatetags 模板,结合 {{ }} 方法调用与模板标签上下文变量
我正在尝试让一个模板标签的结果依赖于另一个模板标签。我的使用场景是这样的:我有一个标题列表,这个列表包含了我想在表格中显示的所有列,以及它们对应的模型和它们是否可见的信息。
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 等等。
所以解决方案可能是类似于 [伪代码] {{ model_instance.header.model_column }} [伪代码] 的形式。
..所以我在寻找一种方法,如何将 Django 模板方法调用与 Django 模板标签属性结合起来..听起来有点疯狂 :D
我希望我解释得够清楚!可能我的问题有更简单的解决方案。但对我来说,这看起来相当通用且简单,应该可以工作。
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, ... }, ... )
我觉得这样做会更容易,因为这样很明确,而且都在视图函数里。
我会把这个做成一个过滤器,因为它可以很简单地根据一个变量的值来显示结果。
@register.filter
def field_from_name(instance, field_name):
return getattr(instance, field_name, None)
然后在模板中:
{{ model_instance|field_from_name:header.model_column }}