如何创建动态django模板容器引用

时间:2015-10-18 23:24:39

标签: django django-templates django-template-filters

我想在django模板中做一些看似微不足道的事情,但很难想象怎么做。假设我有一个列表 field_list = [' a',' b',' c' ]和一个名为 report_item 的容器。在模板中,我想基本上做这个:

{% for fld_name in field_list %}
  <td>{{ report_item.{{fld_name}} }}</td>
{% endfor %}

我已经验证了report_item.a,.b,.c是可访问的(即使它们不是应该没问题)。我已尝试过引用等各种可能的组合和网络搜索解决方案,阅读文档N次但仍然会出现此错误:

Could not parse the remainder: '{{fld_name' from 'field_list.{{fld_name'

非常感谢您的帮助。

修改 我被问到下面是如何建立我的items_list:

context[ "items_list" ] = MyModel.objects.filter(...)

我有:

context[ "field_list" ] = [ 
        [ "Date Placed",                "date_placed" ],
        ...
    ]

在模板中我有:

{% for report_item in items_list %}
    {% for fld_hdr, fld_name in field_list %}
       {{ report_item.{{fld_name}} }}
    {% endfor %}
{% endfor %}

如前所述,如果我这样做:

{{ report_item.date_placed }}

它工作正常。

2 个答案:

答案 0 :(得分:2)

您想要从对象动态获取属性。对于Python中的那个,你使用getattr,在Python模板中执行此操作的方法是编写一个在其参数上调用getattr的过滤器。

@register.filter
def get_field(obj, arg):
    return getattr(obj, arg)

现在你可以{{ report_item|get_field:fld_name }}

答案 1 :(得分:1)

试试{{report_item.fld_name}}。希望这可以帮助。