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

Python django templatetags模板,将{{}}方法调用与模板标记上下文变量组合,python,django,Python,Django,我试图使一个模板标记的结果依赖于另一个模板标记。用例如下所示。我有一个标题列表,其中包含我想在表中显示的所有列+它们正在显示的模型的列+它们是否可见 LIST_HEADERS = ( ('Title', 'title', True), ('First Name', 'first_name', True), ('Last Name', 'last_name', True), ('Modified At', 'modified', False), ) 现在我有了一个

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

LIST_HEADERS = (
    ('Title', 'title', True),
    ('First Name', 'first_name', True),
    ('Last Name', 'last_name', True),
    ('Modified At', 'modified', False),
)
现在我有了一个templatetag,它可以打印出所有的标题。因此,我想创建一个模板标记,用于打印表体。因此,我希望获取标题列表并检查哪个标题是可见的,并希望相应地显示或隐藏我的值

因此,我在下面创建了templatetag模板:

<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>

{headers%中的头的%s}
{%if header.visible%}
{%else%}
{%endif%}
{%endfor%}
您可以在那里看到值{model_instance.title}。我要将此值更改为model_instance.title、model_instance.first_name、model_instance.last_name。。。在运行时

因此,我正在寻找一种方法,如何将{{model_instance}}与header.model_列结合起来

model_列等于列表_标题中的第二个条目。因此,model_列将是title,first_name

因此,解决方案类似于[pseudocode]{{model_instance.header.model_column}}[pseudocode]

…因此,我寻找一种方法,如何将django模板方法调用与django模板标记属性结合起来..嗯。。听起来很疯狂:D


我希望我解释得足够好!也许有一个更容易解决我的问题的办法。但在我看来,这似乎相当通用和简单,并将工作

我将把它作为一个过滤器来做,因为它们提供了一种简单的方法来呈现依赖于变量值的结果

@register.filter
def field_from_name(instance, field_name):
    return getattr(instance, field_name, None)
然后在模板中:

{{ model_instance|field_from_name:header.model_column }} 

我将把它作为一个过滤器来做,因为它们提供了一种简单的方法来呈现依赖于变量值的结果

@register.filter
def field_from_name(instance, field_name):
    return getattr(instance, field_name, None)
然后在模板中:

{{ model_instance|field_from_name:header.model_column }} 
简化这一点

首先,阅读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, ... }, ... )
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, ... }, ... )
在模板中

{% for style, name, value in show_list %}
<tr class="{% cycle odd,even %}">
    <td class="{{style}}"><a href="...">{{value}}</a></td>
{% endfor %}
我发现上面的代码更容易使用,因为它是显式的,并且在视图函数中。

简化它

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, ... }, ... )
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, ... }, ... )
首先,阅读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, ... }, ... )
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, ... }, ... )
在模板中

{% for style, name, value in show_list %}
<tr class="{% cycle odd,even %}">
    <td class="{{style}}"><a href="...">{{value}}</a></td>
{% endfor %}

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

+1在视图中做得更多,在模板中做得更少。这会让一切更具可读性。哇。。印象深刻。太快了。。我从你的帖子中学到了很多。在视图中做得更多,在模板中做得更少。这会让一切更具可读性。哇。。印象深刻。太快了。。我从你的帖子中学到了很多。
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, ... }, ... )
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, ... }, ... )