2016-12-05 58 views
1

所以我試圖將一個Jinja2模板的值傳遞迴我的Python代碼。我試圖用隱藏的輸入來做到這一點。我的窗體類是這樣的:Flask隱藏的輸入沒有在模板中設置

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。

任何想法如何做到這一點?

編輯: 我覆蓋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) }}

編輯

更換{{ form.hidden_tag() }}{{ form.csrf_token() }}以及做什麼是我原來的答覆。
您可能還需要使用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

但由於某些原因,它不會:將'result'賦值給'form.hidden.data'時,'form.data'字典會被新數據更新,因此不會使用提交的'hidden',而是與新的「隱藏」。提交正確的選擇時,我仍然收到「錯誤」的提示。 –

相關問題