web-dev-qa-db-ja.com

WTForms-textareaフィールドに事前入力する方法は?

こんにちは私はテンプレートでこのようなものを使用してtextareafieldをpepopulateしようとしています。

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

これは、主にhtmlが<input type="text">の値を受け入れるため、フィールドがtextfieldの場合に機能しますが、textareaでは同じことが機能しません...誰かがこれを手伝ってくれませんか?

19
Rasmus

textareaウィジェットの場合、フィールドコンストラクターのdefault引数を使用してデフォルトのコンテンツを設定します。

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

次に、レンダリングするとき:

{{form.content()}}

WTFormsはデフォルトのテキストをレンダリングします。レンダリング時にテキスト領域のデフォルトテキストを指定する方法を見つけることができませんでした。

16
Sean Vieira

レンダリングする前に、次のように行うことができます。

form.content.data = 'please type content'

ただし、WTFormsは初めてです。

31
hilquias

私は最近同じ問題を抱えていました、私はそれを次のように解決しました:

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

テストのために、次のスニペットを実行してみてください。

>>> 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>'
13

アリスはあなたが求めていることをするためにフォームウィジェットに組み込まれたサポートがあるようですが、あなたは正しいです、それは現時点では機能しません。

ショーンとヒルキアスは、ディーセントワークアラウンドを投稿しています。これはあなたが試すかもしれない形(yuk yuk)です

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

これを動的に実行しようとしている場合in jinjaテンプレート、レンダリング前にデフォルト値を設定しても、この問題は修正されません。

WTForms標準を使用する代わりに:

{{ form.content() }}

この要素は、次のような生のHTMLで作成できます。

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

...そしてそれはあなたのWTForms検証でまだ機能します。

これが誰かに役立つことを願っています:)

3
G. Shand

また、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))

したがって、comments = promise.commentsは、「 'comments'という名前の TextAreaField フィールド内のテキストをに含まれるデータに設定する」と言います。 Prospect.comments」

3
Dave Roma

このスレッドは少し古いですが、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をインポートすることを忘れないでください。

1
Dailyrox

TextAreaフィールドを使用してフォームを定義します

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

テンプレートをレンダリングする前にtextareaコンテンツを設定する

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>
1
broox