2016-12-05 5 views
1

私はJinja2テンプレートの値をPythonコードに戻そうとしています。私は隠された入力でこれをしようとしています。私のフォームクラスはこれです:フラスコ隠し入力がテンプレートに設定されない

class TrueOrFalseForm(flask_wtf.FlaskForm): 
    choice = RadioField(choices=[('True', 'TRUE'), ('False', 'FALSE')], validators=[validators.InputRequired()]) 
    hidden = HiddenField() 
    submit = SubmitField('Submit') 

そして、私のフォームはこれです:

<form autocomplete="off" action="" method="post"> 
    {{ form.hidden_tag() }} 
    <div style="text-align: center"> 
     <div style="display: inline-block"> 
      {{ form.choice }} 
      {{ form.hidden(value="{{ result }}") }} 
      {{ form.submit(class_="btn btn-primary btn-lg") }} 
     </div> 
    </div> 
</form> 

resultは、テンプレートをレンダリングするとき、私は渡している文字列です。

form.hidden.dataの値を確認すると、''に戻ります。タグは<input id="hidden" name="hidden" type="hidden" value="">と表示されます。

また、value="{{result}}"の代わりにvalue={{ result }}を実行しようとしましたが、JinjaがTemplateSyntaxErrorをスローします。

これはどのように行うのですか?

EDIT: は、私は関数を呼び出すたびにresult上書きしています。

@app.route('/', methods=['GET', 'POST']) 
def home(): 
    form = forms.TrueOrFalseForm() 
    x = random.randint(-100, 100) 
    y = random.randint(-100, 100) 
    statement_str = generate_statement_string(2) 
    tree = BinTree.build_tree(statement_str) 
    statement_result = BinTree.solve_tree(tree, x, y) # result gets overwritten here 
    if form.validate_on_submit(): 
     if not flask_login.current_user.is_anonymous: 
      # same as the else, except with some sql, not relevant 
     else: 
      if form.choice.data == form.hidden.data: 
       flask.flash('Correct!') 
      else: 
       flask.flash('Incorrect!') 
    return flask.render_template('home.html', x_value=str(x), y_value=str(y), statement=statement_str, 
          result=str(statement_result), form=form) 
+1

何http://stackoverflow.com/questions/13619558/wtforms-hidden-field-value?:について – jmunsch

+0

@jmunsch私はレンダリングの間の値を変更するので私のために働かなかった。 –

答えて

2

{{ form.hidden(value="{{ result }}") }}は外側の二重中括弧付きテンプレートの構文で、すでにある: これは私のルート機能です。したがって、あなただけ分かりやすく、このように、結果の変数を記述することができるはずです:{{ form.hidden(value=result) }}

EDIT

{{ form.csrf_token() }}だけでなく、私のオリジナルの答えである何やって{{ form.hidden_tag() }}を交換してください。
フォームをform = forms.TrueOrFalseForm(request.form)でインスタンス化する必要があります。あなたがそれをしなければ、いくつかのフォームは変な動作をします。

+0

これは私にとってはうまくいかず、空の文字列を取得しています。 –

+0

@BarakNehmad私は私の答えを編集しました。それが動作しない場合は教えてください。 –

0

テンプレートに{{ form.hidden_tag() }}を使用しているため、hiddenフォームフィールドを明示的にレンダリングする必要はありません。それはhidden_tag()コールに含まれます。

テンプレートをレンダリングする前に、非表示フィールドの値をビューで設定できます。

views.py

form.hidden.data = result 

return render_template("index.html",form=form) 

index.htmlを

<form autocomplete="off" action="" method="post"> 
    {{ form.hidden_tag() }} 
    <div style="text-align: center"> 
     <div style="display: inline-block"> 
      {{ form.choice }} 
      {{ form.submit(class_="btn btn-primary btn-lg") }} 
     </div> 
    </div> 
</form> 
+0

問題は、私が関数を呼び出すたびに 'result'が上書きされることです。これを反映させるために私は 'def home()'を元の質問に追加しました。 –

+0

なぜそれが問題なのか分かりません。あなたが 'home'と呼んだときに' result'を計算し、それを 'form.hidden.data'に代入してテンプレートにレンダリングされるようにします。フォームを送信するときには、新たに生成された 'result'には関係しません。送信された' choice'と 'hidden'入力フィールドのみで処理されます。 –

+0

しかし何らかの理由で、 'form.hidden.data'に' result'を代入すると、 'form.data' dictは新しいデータで更新されます。したがって、submitされた' hidden'ではなく、新しい「隠れた」私は正しい選択肢を提出するときに、依然として「間違っている」と感じています。 –

関連する問題