django templatetags 模板,结合 {{ }} 方法调用与模板标签上下文变量

0 投票
2 回答
1416 浏览
提问于 2025-04-15 17:20

我正在尝试让一个模板标签的结果依赖于另一个模板标签。我的使用场景是这样的:我有一个标题列表,这个列表包含了我想在表格中显示的所有列,以及它们对应的模型和它们是否可见的信息。

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 个回答

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, ... }, ... )

我觉得这样做会更容易,因为这样很明确,而且都在视图函数里。

2

我会把这个做成一个过滤器,因为它可以很简单地根据一个变量的值来显示结果。

@register.filter
def field_from_name(instance, field_name):
    return getattr(instance, field_name, None)

然后在模板中:

{{ model_instance|field_from_name:header.model_column }} 

撰写回答