随机过滤器重复使用,每次
问题描述:
我想在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
任何帮助表示赞赏! 谢谢:)
答
这似乎是在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)。
你确定你的浏览器不会缓存页面吗?随机'做它在罐子上说的,但你的结果仍然可以在其他地方缓存。 –
但后来使用范围它应该也行不通,不应该吗?而且我也在for循环中使用它,所以我应该至少在循环内部得到不同的值。 – Earthling
取决于你在哪里使用它。您并没有在这里创建很多[MCVE]来验证此行为。但我从来没有与'随机'的问题。 –