【问题标题】:Flask hidden input doesn't get set in templateFlask 隐藏输入未在模板中设置
【发布时间】:2017-04-20 09:01:57
【问题描述】:

所以我试图将 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 的值时,它返回为''。该标记也呈现为&lt;input id="hidden" name="hidden" type="hidden" value=""&gt;。

我也尝试过使用 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)

【问题讨论】:

标签: python html flask


【解决方案1】:

我的建议是:

<input type="hidden" id="locphoto" value="{{ mbrs.photoName|safe }}" />

以前的答案是正确的,但我认为他们需要进行一些更正,将 safe 放入变量 jinja:

【讨论】:

    【解决方案2】:

    {{ form.hidden(value="{{ result }}") }} 已经在使用外部双大括号进行模板语法。因此,您应该能够清楚地编写结果变量,如下所示:{{ form.hidden(value=result) }}

    编辑

    将{{ form.hidden_tag() }} 替换为{{ form.csrf_token() }},并按照我原来的答案进行操作。
    您可能还必须使用form = forms.TrueOrFalseForm(request.form) 实例化表单。如果您不这样做,某些表单的行为会很奇怪。

    【讨论】:

    • 这对我不起作用,我只是得到一个空字符串。
    • @BarakNehmad 我编辑了我的答案。如果它不起作用,请告诉我。
    【解决方案3】:

    由于您在模板中使用{{ 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>
    

    【讨论】:

    • 问题是,result 每次调用该函数时都会被覆盖。我已将 def home() 添加到原始问题中以反映这一点。
    • 我不确定为什么会出现问题 - 当您调用 home 时,您会计算 result 并将其分配给 form.hidden.data,以便它可以在模板中呈现。那么当你提交表单时,你并不关心新生成的result,只关心提交的choice和hidden输入字段。
    • 但由于某种原因它没有:当将result 分配给form.hidden.data 时,form.data 字典会使用新数据进行更新,因此不使用提交的hidden,而是使用新的hidden。提交正确选择时,我仍然收到Incorrect。
    猜你喜欢
    • 2016-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    相关资源
    最近更新 更多