2017-07-07 4 views
0

同じ値を再利用し、この方法:ランダムフィルタは、私は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]をあまり作成していませんでした。しかし、私は「ランダム」との問題は一度もありませんでした。 –

答えて

0

これはJinja 2.9で導入されたバグです。 2.9リリース(2.9 - 2.9.6)で再現できます。神社2.8と神社2.8.1作業の罰金、およびランダムな値は、レンダリング中に混入されています。このが唯一の直接randomとテンプレートに埋め込むリテラルのリストに適用されることを

$ 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()という結果が得られます。その変数は{% set ... %}でテンプレートに設定することもできます。それは、テンプレートコンパイラがどこかで遠すぎる1つのステップを最適化しているようです。テンプレートに変数として、リスト内の

  • 使用{% 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

関連する問題