【问题标题】:Form data not submitted when textarea already filledtextarea 已填满时未提交表单数据
【发布时间】:2019-03-15 12:24:33
【问题描述】:

我正在使用 WTForms 和 Jinja2 制作带有可编辑文本区域的页面。这个想法是在数据库中编辑文本,因此 textarea 应该已经填充了文本供用户编辑。

基于this question/answer 我有类似的东西 以下代码:
app.py:

form = MyForm() # MyForm is defined elsewhere simply as 
                # class MyForm(FlaskForm): content=TextAreaField()
prepopulated = GetTextFromDatabase()
form.content.data = prepopulated

if form.validate_on_submit():
    new_content = form.content.data
    SaveToDatabase(new_content)

return flask.render_template('edit.html', form=form)

edit.html:

<form method="POST">
  <div>
    {{ form.hidden_tag() }}
    {{ form.content }}
  </div>
  <div>
    <button type="submit">Submit</button>
  </div>
</form>

但是,在提交时,对文本所做的更改不会保存在数据库中。如果我删除 form.content.data = prepopulated 更改将被保存。

那么,如何预先填充文本区域,同时确保保存对文本的任何更改?

【问题讨论】:

    标签: python html jinja2 flask-wtforms


    【解决方案1】:

    您尚未共享您的 MyForm 的代码,这会很有帮助,因为您发布的链接中接受的答案建议在表单创建步骤中使用 default 参数。

    这不起作用的原因是,如果用户 POSTS 将表单发送到您的路由,那么您所做的只是在使用此代码验证表单之前覆盖数据

    prepopulated = GetTextFromDatabase()
    form.content.data = prepopulated
    

    为什么不先尝试验证表单数据并像这样执行数据库保存:

    if form.validate_on_submit():
        new_content = form.content.data
        SaveToDatabase(new_content)
    else:
        prepopulated = GetTextFromDatabase()
        form.content.data = prepopulated
    
    return flask.render_template('edit.html', form=form)
    

    【讨论】:

    • “因为您发布的链接中接受的答案建议在表单创建步骤中使用默认参数” - 我在问题中添加了表单的定义。我没有看到默认参数的相关性,因为您无法动态设置它。无论如何,您的解决方案奏效了。我原以为在if form.validate(): 之外有form.content.data = prepopulated 就足以防止覆盖。
    • 如果需要的话,有一些方法可以动态设置默认值。要么将表单创建包装在一个函数中(搜索动态 wtforms 会产生很多结果)。或者在表单的 init 方法中首先使用 super().__init__() 然后设置你的值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    • 2012-09-23
    • 1970-01-01
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多