WTForms-Как предварительно заполнить поле textarea? - PullRequest
18 голосов
/ 25 февраля 2011

Привет. Я пытался заселить текстовое поле, используя что-то подобное в шаблоне.

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

Это работает, когда поле является текстовым полем, главным образом, потому что html принимает значение для <input type="text">, но то же самоене работает для textarea ... Может кто-нибудь, пожалуйста, помогите мне с этим?

Ответы [ 9 ]

31 голосов
/ 03 марта 2011

Вы можете сделать это перед рендерингом, что-то вроде:

form.content.data = 'please type content'

Я новичок в WTForms.

16 голосов
/ 26 февраля 2011

Для textarea виджетов, вы устанавливаете содержимое по умолчанию с аргументом default в ваших конструкторах полей.сделать текст по умолчаниюМне не удалось найти способ указать текст по умолчанию для текстовой области во время рендеринга.

13 голосов
/ 02 февраля 2013

У меня недавно была такая же проблема, я решил ее так:

{% 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>'
6 голосов
/ 12 апреля 2011

Алиса, кажется, встроена поддержка в виджет формы, чтобы делать то, что вы ищете, но вы правы, в данный момент это не работает.

Шон и Хилькиас выкладывают достойные обходные пути, которые работают.Это форма (юк юк), которую вы можете попробовать

 else:
        form.title.data=blog.title
        form.blogdata.data=blog.blogdata
    return render_template('editblog.html',form=form)
3 голосов
/ 03 ноября 2018

Для тех, кто пытается сделать это динамически в шаблоне jinja, установка значения по умолчанию перед рендерингом не решает эту проблему.

Вместо использования стандарта WTForms:

{{ form.content() }}

Вы можете создать этот элемент с необработанным HTML, например:

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

... и он все равно будет работать с вашей проверкой WTForms.

Надеюсь, это кому-нибудь поможет :)

3 голосов
/ 29 мая 2014

Вы также можете предварительно заполнить поле textarea, передав его в экземпляр класса WTforms в render_template (в этом примере я использую фреймворк 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 = prospect.comments говорит "установить текст внутри поля TextAreaField с именем 'comments' для данных, содержащихся в prospect.comments"

1 голос
/ 29 июля 2014

Определите вашу форму с полем 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>
0 голосов
/ 13 мая 2014

Этот поток немного староват, но если вам нужно предварительно заполнить поле textarea динамическим содержимым, вы можете использовать setattr и параметр по умолчанию , например, так:

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.

0 голосов
/ 25 февраля 2011

В Textarea вам потребуется использовать innerHTML или html (), если вы используете jquery.

в вашем контексте должно быть:

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

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

Надеюсь, это поможет.

...