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

时间:2009-12-24 13:16:13

标签: python django

我试图使模板标签的结果依赖于另一个模板标签。用例如下。我有一个标题列表,其中包含我想要在表格中显示的所有列+他们正在显示的模型列+是否可见。

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

我希望我解释得足够好!可能有一个更容易解决我的问题。但这在我看来非常通用和容易,并将工作。

2 个答案:

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

我发现上面的内容更容易使用,因为它是显式的并且在视图函数中。