Как я могу передать значение в мою форму Flask

#python #flask #flask-wtforms

#python #flask #flask-wtforms

Вопрос:

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

У меня есть класс form:

 class CreateKardForm(FlaskForm):
kardTitle = StringField('Title')
contentText = TextAreaField('Content', [InputRequired(message="You must fill in some text.")])
keywords = StringField('Keywords', [InputRequired(message="Please enter at least one keyword. Separate keywords with commas.")])
createDate = DateField('Creation Date')
modifiedDate = DateField('Last Modified Date')
submit = SubmitField('Save')
  

И HTML-файл:

 <!DOCTYPE html>
<html lang="en">
{% extends "formbase.html" %}
{% block content %}
<div class="formwrapper>
    <h1>Create a New IdxKard</h1>
    <form action="" method="post" novalidate>
        {{ form.hidden_tag() }}
        ...
        <p>
            {{ form.createDate.label }}<br>
            {{ form.createDate }}
        </p>
        <p>
            {{ form.modifiedDate.label }}<br>
            {{ form.modifiedDate }}
        </p>
        <p>{{ form.submit() }}</p>
    </form>

</html>

{% endblock %}
</html>
  

И маршрут:

 @app.route('/createKard', methods=['GET', 'POST'])
def createKard():
    print('In createKard')
    creationDate = datetime.now()
    print('creationDate=', creationDate)
    form = forms.CreateKardForm()

    if form.validate_on_submit():
        print('In createKard in main')

        title = request.form['kardTitle']
        content = request.form['contentText']
        keywords = request.form['keywords']
        createDate = request.form['createDate']
        modifiedDate = request.form['modifiedDate']

        # do stuff

    return render_template('createKard.html', createDate=creationDate, form=form)
  

Я хочу, чтобы эта дата создания отображалась в форме при ее загрузке, но это не так. Я подозреваю, что я все еще не совсем понимаю, что происходит. Я думаю, поскольку пользователь еще не нажал кнопку отправки, этот возврат с помощью render_template должен отображать HTML и передавать CreateDate . Когда пользователь нажимает кнопку отправки, validate_on_submit имеет значение true, и выполняется остальная часть кода. Однако, как мне передать значение в форму, чтобы оно отображалось?

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

1. Данные из проверенной формы обычно извлекаются следующим образом: title = form.kardTitle.data

2. @VPfB — Спасибо! Я внесу это изменение.

3. Я не знаю, является ли это вашим реальным кодом, но следите за ошибками отступов

4. @monsieuralfonse64 При копировании кода здесь у меня было несколько ошибок с отступами. Спасибо, что дали мне знать. Я думаю, что я в порядке, но перепроверю.

Ответ №1:

Перед передачей экземпляра CreateKardForm to render_template вы должны установить его createDate.data :

 @app.route('/createKard', methods=['GET', 'POST'])
def createKard():
    print('In createKard')
    creationDate = datetime.now()
    print('creationDate=', creationDate)
    form = forms.CreateKardForm()
    form.createDate.data = creationDate  # pre-populate the form
    
    # ...

    return render_template('createKard.html', createDate=creationDate, form=form)
  

Вот результат:

предварительно заполненная форма в браузере

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

1. Спасибо! Я полагал, что это должно быть прямолинейно, но ни одна из вещей, которые я видел, не пыталась выполнить эту функциональность.