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-如何预填充文本区域字段?的主要内容,如果未能解决你的问题,请参考以下文章