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

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

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

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

【问题讨论】:

  • Alice,在这种情况下,form 是什么——它是 WTForms.Form 对象还是别的什么?
  • 它是一个 WTForms.Form 对象肖恩!

标签: python flask wtforms


【解决方案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 在这种情况下无济于事。
        • 感谢您的帮助!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-29
        • 1970-01-01
        相关资源
        最近更新 更多