Заполнить поле текстовой области с помощью WTForms

#python #forms #flask #textarea #wtforms

#python #формы #flask #текстовая область #wtforms

Вопрос:

Насколько я понимаю, если вы хотите заполнить текстовую область, вы помещаете текст между тегами текстовой области. Однако я использую WTForms. Как я могу предварительно заполнить форму из представлений или в моем шаблоне?

ФОРМА

 class ModuleSectionForm(FlaskForm):
    title = StringField('Section Title', validators=[DataRequired()])
    description = TextAreaField('Description', validators=[DataRequired()])
    submit = SubmitField('Add Section')
  

Вид

 @modules.route('/update_section/<name>/<title>', methods=['GET', 'POST'])
def update_section(name, title):
    form = ModuleSectionForm()
    module = Module.objects(title=name).first()
    section = None
    for sect in module.sections:
        if sect.title == title:
            section = sect
    #if form.validate_on_submit():
        #save data 
    return render_template('modules/update_section.html', section=section, form=form) 
  

ШАБЛОН

 <form method="post" action="{{ url_for('modules.update_section', name=name) }}">
    {{ form.hidden_tag() }}
    <div class="form-group">
        {{ form.title.label(class="form-control-label") }}
        {{ form.title(class="form-control", value=section.title) }}
    </div>
    <div class="form-group">
        {{ form.description.label(class="form-control-label") }}
        {{ form.description(class="form-control", default=section.description) }}
    </div>
    <div class="form-group">
        {{ form.submit(class="btn btn-secondary shadow") }}
    </div>
</form>
  

Комментарии:

1. Вы когда-нибудь это понимали?

Ответ №1:

Это можно сделать, просто назначив текст для отображения заранее (например, в представлении).

Попробуйте отредактировать свой view ( update_section ) таким образом:

   form.description.data = 'text you want to display'
  

И ваш шаблон следующим образом:

 - {{ form.description(class="form-control", default=section.description) }}
  {{ form.description(class="form-control") }}
  

Имейте в виду, есть альтернативный способ, который заключается в указании атрибута placeholder (но я думаю, это не то, что вы хотите здесь сделать).

Ответ №2:

Обычно с помощью WTForms (предположим, здесь вы используете Flask и Bootstrap) вы будете использовать value атрибут ввода для предварительного заполнения поля формы. Обратите внимание, что предварительное заполнение поля отличается от предоставления «заполнителя», который является всего лишь эфемерным намеком. Поэтому обычно мы предварительно заполняем так:

 <div class="form-group row">
 <label for="form_subject" class="col-sm-2 col-form-label">Subject</label>
 <div class="col-sm-7">
  <input class="form-control" id="form_framework" name="form_framework"
value="{{ instruct.Subject }}">
 </div>
</div>
  

С помощью Flask и Bootstrap name атрибут требуется для передачи значения обратно контроллеру при отправке, value атрибут используется для предварительного заполнения поля из объекта — в этом случае наш контроллер передал объект с именем instruct, который имеет атрибут Subject .

Но вы должны знать, что разные типы входных данных в WTForms имеют разные атрибуты, и это остается забавной задачей для разработчика, чтобы разобраться.

У TextArea нет value атрибута, поэтому для предварительного заполнения поля необходимо указать значение между тегами, например, так (опять же, используя Bootstrap здесь на случай, если какой-либо из этих тегов незнаком):

 <div class="form-group row">
 <label for="form_longish_text"
class="col-sm-2 col-form-label">Longish Text</label>
 <div class="col-sm-7">
  <textarea class="form-control" rows="3" 
id="form_longish_text"
name="form_longish_text">{{ instruct.LongishText }}
  </textarea>
 </div>
</div>