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 方法,而不需要封装它的&lt;span&gt;(因此该代码的输出不会发送到浏览器)?这样做可以吗:

<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 代码的输出?的主要内容,如果未能解决你的问题,请参考以下文章

如何最好地集成 Flex 和 Django?

如何重新加载 Django 模板?

在没有数据持久性的情况下,如何最好地在 Django 中压缩表单:最 Djangonic 的方法是啥? [关闭]

如何比较 Django 模板中的日期

在 Django 模板中的 JSON 中安全地使用带有 html 的 JSON

如何检查Django中是不是存在模板?