Django 模板:如何最好地抑制在 Django 模板中执行 python 代码的输出?
Posted
技术标签:
【中文标题】Django 模板:如何最好地抑制在 Django 模板中执行 python 代码的输出?【英文标题】:Django Templates: How best can the output of executing python code in a Django template be suppressed? 【发布时间】:2016-11-23 05:47:33 【问题描述】:以前可能有人遇到过这种情况,甚至文档也可能已经提供了解决方案,但我还没有找到。我的情况是这样的:
只是为了说明真正的问题:假设我有一个传递给模板的列表,以及我迭代的列表,在一个实例中使用 % for...
,在另一个实例中,我只需要显示它的第一个仅 5 个元素(例如基于某些条件,而不仅仅是列表的前 5 个元素)。两个循环都用于动态输出表格。现在,这是第二个棘手的实例......我采用了the solution here,它利用一个特殊的计数器类,传递给模板上下文,并且必须调用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 代码的输出?
【问题讨论】:
How do you limit list objects template side, rather than view side的可能重复 @solarissmoke 我的问题的限制方面只是我用来说明真正问题的一个场景 - 这是:在 Django 模板中执行 python 代码的输出如何最好被抑制了? 这个问题没有得到解决,不管我们是在谈论Counter.increment
的输出还是其他一些任意的方法调用或变量输出。
我在这方面的建议是,如果您发现自己在模板级别执行这样的复杂逻辑,您需要重新考虑它并找到一种方法在您的视图(或模板中)执行逻辑标签)。
【参考方案1】:
你也可以使用with
标签并忽略变量:
% with ignorevar=Counter.increment %% endwith %
【讨论】:
这很整洁。谢谢。【参考方案2】:这有点小技巧,但它会解决你的问题:
Counter.increment|yesno:","
(参见yesno
过滤器上的documentation)
【讨论】:
这确实是一个聪明的黑客,但我想知道(因为它没有记录,我还没有尝试过),yesno
过滤器是否允许“空”替代品?否则,这似乎是......而且非常接近我已经尝试做的事情。
我看不出它为什么不能与“空”值一起使用。 Python 中的所有值都是真值或假值。【参考方案3】:
如果您只需要前 5 个元素,那么我认为正确的方法是首先将仅前 5 个元素的列表从您的视图发送到您的 html 模板。
另外,如果由于某种原因,您无法做到这一点,那么您应该在 Django 中有一个称为模板标签的东西,您可以在其中进行所有计算。
看到这个 -> https://docs.djangoproject.com/en/1.9/howto/custom-template-tags/
最后,如果您仍想使用 Counter.increment,只需将其放入一个 div 中,说“count-flag”并使用您的 javascript,在页面加载时永远隐藏该 div:
$(document).on('ready', function()
$("#count-flag").hide();
因此它不会显示在您的 html 上,但从技术上讲,这不是这样做的方式。
【讨论】:
在问题中,我指出我在两个地方使用相同的列表 - 在同一个模板中,因此,发送两个列表是多余的,即使我知道我可以,因此,我需要找到一种优雅的方法来停止第二个用例中的迭代。至于抑制输出,我已经为此使用了 inline-css 规则 - 请检查我的代码。所以,我不认为你的解决方案比我已经在做的更好。 如果您在两个地方使用相同的列表,那么您不需要发送两次。很明显,第一次使用时不会被消耗掉。其次,正如我在回答中提到的,为了在 HTML 中进行计算,Django 中有一个称为 TemplateTags 的东西,我为您提供了它的链接。仔细阅读它,希望它能给你一个更好的方法来解决你的问题。 那么,按照模板标签的方式,也许像 Object.method_producing_output| suppress
这样的过滤器就是你在说的?或者一个 real 模板标签,例如% suppressed % Object.method_producing_output % endsuppressed %
。我可以编写这样的解决方案,但想知道内置程序是否已经提供了这样的机制,因为这似乎是一个相当典型的场景......
我说的是第一个。如果你做的很少。计算然后你可以只在你的 html 中进行,但是如果有复杂的计算,正如你对 solarissmoke 的回答,你只是在你的问题中给出了一个例子,并且循环中可能还有其他逻辑和计算,那么在这种情况下,我们使用模板标签。我的意思是这就是为什么一开始就引入它们的原因,因为您不想在前端进行耗时的计算,因为它会减慢页面加载速度所以就像加载静态文件一样,加载过滤器跨度>
以上是关于Django 模板:如何最好地抑制在 Django 模板中执行 python 代码的输出?的主要内容,如果未能解决你的问题,请参考以下文章
在没有数据持久性的情况下,如何最好地在 Django 中压缩表单:最 Djangonic 的方法是啥? [关闭]