随机过滤器重复使用,每次

问题描述:

我想在Jinja2的随机拿起从列表中相同的数值,这样一来:随机过滤器重复使用,每次

{{ ['#EDD7C9', '#EDD7C9', '#EEE'] | random }} 

它随机选择一个元素,但它重用它的每一个未来时间。如果我改变了我的模板中的内容,那么它会再次提取一个不同的数字。

但是,很奇怪,如果我使用范围,它工作得很好:

{{ range(1,100) |random }} 

的我如何从一个固定的列表中选择一个随机项的任何想法,而无需创建我自己的过滤器?

只需添加一个更完整的示例:

{% for i in range(5) %} 
    {{ ['#EDD7C9', '#EDD7C9', '#EEE'] | random }} 
    {{ range(1,100) | random }} <br/> 
{% endfor %} 

输出:

#EEE 8

#EEE 61

#EEE 58

#EEE 64

#EEE 76

任何帮助表示赞赏! 谢谢:)

+0

你确定你的浏览器不会缓存页面吗?随机'做它在罐子上说的,但你的结果仍然可以在其他地方缓存。 –

+0

但后来使用范围它应该也行不通,不应该吗?而且我也在for循环中使用它,所以我应该至少在循环内部得到不同的值。 – Earthling

+0

取决于你在哪里使用它。您并没有在这里创建很多[MCVE]来验证此行为。但我从来没有与'随机'的问题。 –

这似乎是在Jinja 2.9中引入的错误。我可以用2.9版本(2.9 - 2.9.6)中的任何一个来复制它。神社2.8和2.8.1神社做工精细,并且随机值混合渲染:

$ cat test.py 
from jinja2 import Template 
template = Template(''' 
{%- for i in range(10) -%} 
{{ ['foo', 'bar', 'baz', 'eggs', 'ham', 'spam'] | random }}{{ ' ' }} 
{%- endfor %} 
''') 
print(template.render()) 
$ bin/python test.py  
eggs eggs eggs eggs eggs eggs eggs eggs eggs eggs 
$ bin/pip -U Jinja2==2.8.1 
Collecting jinja2==2.8.1 
    Using cached Jinja2-2.8.1-py2.py3-none-any.whl 
Requirement already up-to-date: MarkupSafe in ./lib/python3.6/site-packages (from jinja2==2.8.1) 
Installing collected packages: jinja2 
    Found existing installation: Jinja2 2.9 
    Uninstalling Jinja2-2.9: 
     Successfully uninstalled Jinja2-2.9 
Successfully installed jinja2-2.8.1 
$ bin/python test.py 
spam ham eggs spam spam eggs eggs baz bar foo 

请注意,此仅适用于后直接嵌入模板,random文字列表。如果您将列表作为变量传入,那么您每次都会得到random()结果;该变量也可以在模板中设置为{% set ... %}。看起来模板编译器正在某处优化一步。

所以对于现在的变通办法是:

  • 使用{% set seq = ['#EDD7C9', '#EDD7C9', '#EEE'] %}{{ seq | random }}
  • 通在列表中作为一个变量到模板和应用random
  • 降级到2.8.1。

我已经提交了issue #739跟踪这个项目。维护人员具有优秀的时间技能,并已修复此问题a day ahead of time。未来的版本将包含此修补程序(2.9.7或2.10)。

+0

这是真的,使用变量解决了这个问题! – Earthling

+0

@Earthling:该变量可以在模板中用{%set var = ...%}设置。 –

+1

我昨天刚刚解决这个问题,它会在下一个版本中发布。 – davidism