WTForms-如何预填充文本区域字段?

Posted

技术标签:

【中文标题】WTForms-如何预填充文本区域字段?【英文标题】:WTForms-How to prepopulate a textarea field? 【发布时间】:2011-07-04 07:12:31 【问题描述】:

嗨,我一直在尝试使用某些东西来填充文本区域 像这样在模板中。

form.content(value="please type content")

这在字段是文本字段时有效,主要是因为 html 接受 <input type="text"> 的值 但同样不适用于textarea ... 有人可以帮我解决这个问题吗?

【问题讨论】:

Alice,在这种情况下,form 是什么——它是 WTForms.Form 对象还是别的什么? 它是一个 WTForms.Form 对象肖恩! 【参考方案1】:

你可以在渲染之前做,比如:

form.content.data = 'please type content'

不过,我是 WTForms 的新手。

【讨论】:

这就是我想要的 当我这样做时,任何提交的数据都不会被记录。 @thosphor 以及以后看到的任何人,这可能是因为该行同时针对 GET 和 POST 请求执行。因此,在执行 POST 请求时,数据将被您想要的“默认”内容覆盖。要解决此问题,只需将行放在“if”块中,如下所示:if request.method == 'GET': form.content.data = 'please type content'【参考方案2】:

对于textarea 小部件,您可以在字段构造函数中使用default 参数设置默认内容。

class YourForm(Form):
    your_text_area = TextAreaField("TextArea", default="please add content")

那么当你渲染时:

form.content()

WTForms 将呈现默认文本。我一直无法找到在渲染时为文本区域指定默认文本的方法。

【讨论】:

谢谢肖恩!但我需要在模板中进行。它有点像编辑博客链接。当您单击任何博客的编辑按钮时,它应该在文本字段中显示一个带有标题的表单(使用 value 参数完成)和文本区域字段中的博客内容。 您好,表单定义、视图功能和表单的html可以在这里查看:-pastebin.com/QC4MC84B <script> var textarea = document.getElementById('yourIDHere'); textarea.innerHTML = " your_text_variable " </script>【参考方案3】:

我最近遇到了同样的问题,我是这样解决的:

% set f = form.content.process_data("please type content") %
 form.content() 

为了测试,你可以尝试运行以下 sn -p:

>>> import wtforms
>>> import jinja2
>>> from wtforms.fields import TextAreaField
>>> class MyForm(wtforms.Form):
...     content = TextAreaField("Text Area")
... 
>>> t = jinja2.Template("""% set f = form.content.process_data("please type content") %
...                      form.content() """)
>>> 
>>> t.render(form=MyForm())
u'\n                    <textarea id="content" name="content">please type content</textarea>'

【讨论】:

这可以解决问题,尽管有一个小问题。我不确定我是否做错了什么。不幸的是,process_data() 在 HTML 上打印了一个 None,除此之外,它是金色的。 对不起,我写答案的时候没有看帖子的标签。我使用 Tornado 模板模块发布了解决方案,但是,我使用 Jinja2 更新了答案。 这对我来说比上述解决方案效果更好,因为它允许可变内容。 谢谢你!我也将它应用到了我的 SelectField 中,并且效果很好!你为我节省了几个小时!【参考方案4】:

Alice 似乎在表单小部件中内置了支持来做你想做的事情,但你是对的,它目前不起作用。

Sean 和 hilquias 发布了有效的体面工作。这是你可以尝试的形式(yuk yuk)

 else:
        form.title.data=blog.title
        form.blogdata.data=blog.blogdata
    return render_template('editblog.html',form=form)

【讨论】:

【参考方案5】:

对于那些试图在 jinja 模板中动态执行此操作的人,在渲染之前设置默认值并不能解决此问题。

不使用 WTForms 标准:

 form.content() 

您可以使用原始 HTML 构造此元素,例如:

<textarea id="FormName-content" name="FormName-content"> dynamic values here </textarea>

...它仍然适用于您的 WTForms 验证。

希望这可以帮助某人:)

【讨论】:

支持你,因为这正是我必须做的,但我认为这是一个非常愚蠢的解决方案!为什么 WTForms 不能以与处理常规文本输入类似的方式处理 TextArea 字段???没有人更新 TextArea 字段中的文本???【参考方案6】:

这个线程有点老了,但是如果你需要用动态内容预填充 textarea 字段,你可以像这样使用 setattr 和 default 参数:

if post.content:

    form = EditPostForm
    setattr(form, "content", TextAreaField(gettext('Post content'), validators=[Length(max=5000)], default=post.content))
    form = EditPostForm()

else:
    form = EditPostForm()

别忘了导入 TextAreaField。

【讨论】:

这是最好的答案!没有其他解决方案对我有用。非常感谢! 这行得通!谢谢! (实际上不需要 gettext('Post content') )【参考方案7】:

您还可以通过将 textarea 字段传递给 render_template 中的 WTforms 类实例来预填充它(在此示例中,我使用 Flask 框架):

@admin.route('/edit/<id>', methods=['GET', 'POST'])
def edit(id):
  if request.method == 'POST':
    form = ProspectForm(request.form)
    prospect = Prospect.objects(id=id).first()
    return render_template('admin/edit.html', prospect=prospect, prospect_form=ProspectForm(comments = prospect.comments))

因此,cmets=prospect.cmets 表示“将名为'cmets' 的TextAreaField 字段内的文本设置为prospect.cmets 中包含的数据”

【讨论】:

【参考方案8】:

使用TextArea 字段定义您的表单

class MyForm(Form):
    name = fields.StringField('Name', validators=[Required()])
    description = fields.TextAreaField('Description')

在渲染模板之前设置文本区域内容

form = MyForm()
form.description.data='this is my textarea content!' # This is the stuff...
return render_template('form.html', form=form, name=name)

渲染模板中的字段

<form ...>
     field(form.name, value=name) 
     field(form.description, rows=2) 
    <button ...>Save</button>
</form>

【讨论】:

【参考方案9】:

在 Textarea 中,如果使用 jquery,则需要使用 innerHTML 或 html()。

在你的上下文中应该是:

form.content.innerHTML = "please type content";

//using jquery
$('#element').html("please type content");

希望对你有帮助。

【讨论】:

WTForms 是一个用于呈现表单 HTML 的服务器端 Python 库——不幸的是,jQuery 在这种情况下无济于事。 感谢您的帮助!

以上是关于WTForms-如何预填充文本区域字段?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 HTML 表单中“预填充”文本区域的值? [复制]

如何在预填充的文本区域中将 <br /> 转换为换行符

HTML / Javascript:如何提交输入并使用提交/添加更多按钮填充文本区域

使用表单助手在 Rails 的预填充文本区域中保留换行符

如何阻止 Chrome 自动完成文本区域?

MVC创建表单加载时如何用一些数据填充文本区域?