Django模板:如何最好地抑制Django模板中执行python代码的输出?

时间:2016-07-20 06:19:15

标签: python django django-templates

之前有人可能已经遇到过这种情况,甚至可能已经提供了解决方案,但我还没有找到解决方案。我的情况是这样的:

只是为了说明真正的问题:假设我有一个列表,我传递给模板,我迭代了哪个列表,在一个实例中有一个{% for...,另一个,我只需要显示它的前5个元素(例如,基于某些条件,而不仅仅是列表的前5个元素)。两个循环都用于动态输出表。现在,这是第二个很棘手的实例......我采用了the solution here,它利用了一个特殊的Counter类,传递给了模板上下文,并且必须在其上调用Counter.increment方法,才能够递增计数器 - 然后我在条件语句中使用它来停止循环的执行。

挑战:

我目前有这样的代码:

<script>{{ Counter.reset }}</script>
<table>
...
{% for l in list %}
{%if Counter.counter <= 5 %}
<tr><td>{{ l.some_field }} <span style="display:none">{{ Counter.increment }}</span></td></tr>
{% endif %}
{% endfor %}
</table>

那么,我怎样才能调用Counter.increment方法,而不需要我封装它的<span>(因此该代码的输出不会发送到浏览器)?可以这样做:

<tr><td>{{ l.some_field }}{{ Counter.increment }}</td></tr>

如果Counter.increment没有返回任何内容,上面的内容会有效,但如果有的话会怎么样?!

如何最好地抑制Django模板中执行python代码的输出呢?

3 个答案:

答案 0 :(得分:1)

这有点像黑客,但它可以解决你的问题:

{{ Counter.increment|yesno:"," }}

(请参阅yesno过滤器上的documentation

答案 1 :(得分:1)

您还可以使用window.onbeforeunload = function ( e ) { var e = e || window.event ; // For Firefox and IE if ( e ) { e.ReturnValue = 'Any string' ; } // For Safari return 'Any string' ; } 标记并忽略变量:

with

答案 2 :(得分:0)

如果您只需要前五个元素,那么我认为正确的方法是首先从您的视图中仅将前5个元素的列表发送到您的html模板。< / p>

此外,如果由于某种原因,你无法做到这一点,那么你应该在Django中有一个称为模板标签的东西,你可以在那里进行所有的计算。

看到这个 - &gt; https://docs.djangoproject.com/en/1.9/howto/custom-template-tags/

最后,如果你仍然想使用Counter.increment,那么只需将它放在div中,然后说'&34; count-flag&#34;并使用您的JavaScript,在页面加载时永远隐藏该div:

$(document).on('ready', function(){
    $("#count-flag").hide();
}

所以它不会显示在你的html上,但从技术上讲,这不是你的方法。