提交后清除 Flask 表单,无需刷新页面

问题描述 投票:0回答:1

我正在 Flask 中构建一个简单的待办事项列表应用程序,并且创建了一个表单,该表单应该在用户帐户中添加任务。

烧瓶形式:

class AddTask(FlaskForm):
    title = StringField('Title', validators = [DataRequired()])
    description = StringField('Description')
    project = SelectField('Project', choices = [], validators = [DataRequired()])
    due_date_time = DateField('Due Date', format = '%Y-%m-%d')
    priority = RadioField('Priority', choices = [(1, 'Priority 1'), (2, 'Priority 2'), (3, 'Priority 3'), (4, 'Priority 4')])
    submit = SubmitField('Add Task')
    attributes_to_clear = [title, description, project, due_date_time, priority]

HTML 代码:

<div class = "new_task_form">
        <form action = "/app/today" method = "POST">
            {{ new_task_form.hidden_tag() }}
            {{ new_task_form.csrf_token }}
            {{ new_task_form.title.label }}
            {{ new_task_form.title }}
            {% if new_task_form.title.errors %}
                <ul class="errors">
                    {% for error in new_task_form.errors %}
                        <li>{{ error }}</li>
                    {% endfor %}
                </ul>
            {% endif %}
            {{ new_task_form.description.label }}
            {{ new_task_form.description }}
            {{ new_task_form.project.label }}
            {{ new_task_form.project }}
            {{ new_task_form.due_date_time.label }}
            {{ new_task_form.due_date_time }}
            {{ new_task_form.priority.label }}
            {{ new_task_form.priority }}
            {{ new_task_form.submit() }}
        </form>
    </div>

路线:

@app.route('/app/today', methods = ['POST', 'GET'])
@login_required
def today():
    today = datetime.today().strftime('%a %b %d')
    projects = [(project.id, project.title) for project in Project.query.filter(Project.user_id == current_user.id).all()]
    new_task_form = AddTask()
    new_task_form.project.choices = projects
    logger.info(f'new_task_form.project.choices: {new_task_form.project.choices}')
    if new_task_form.validate_on_submit():
        logger.info(f'new_task_form.validate_on_submit() returned {new_task_form.validate_on_submit()}')
        project_from_form = Project.query.filter(Project.id == new_task_form.project.data).first()
        logger.error(f'project_from_form: {project_from_form}')
        new_task = Task(
            title = new_task_form.title.data,
            description = new_task_form.description.data,
            project = project_from_form,
            due_date_time = new_task_form.due_date_time.data,
            priority_level = new_task_form.priority.data,
            user_id = current_user.id
        )
        db.session.add(new_task)
        db.session.commit()
    else:
        logger.info(f'new_task_form.validate_on_submit(): Returned {new_task_form.validate_on_submit()}')
        logger.info(f'new_task_form.errors: {new_task_form.errors}')
    pending_tasks = Task.query.filter(Task.user_id == current_user.id, Task.completed_status == 0).all()
    pending_tasks_length = len(pending_tasks)
    logger.info(f'current_user: {current_user.id}')
    logger.info(f'pending_tasks_length: {pending_tasks_length}')
    logger.info(f'pending_tasks: {pending_tasks}')
    return render_template('today.html',
        day_and_date = today,
        new_task_form = new_task_form,
        user_projects = projects,
        pending_tasks_length = pending_tasks_length,
        pending_tasks = pending_tasks)

我遇到的问题是我不希望页面在提交后刷新。现在,它的工作原理是您可以添加任务,它会立即填充在页面上。然而,实际的 Flask 表单将保留您之前插入的任何内容,并且刷新将导致它重新提交。我环顾四周,但找不到消除文本的方法,我厌倦了使用

default
值,构建将它们重置为空字符串的函数,但到目前为止我尝试过的任何方法都无法修复此问题特定问题。

html flask flask-sqlalchemy flask-wtforms
1个回答
0
投票

即使在使用已完成的相同表单将成功的条目提交到数据库后,您也会将此 html 发送给用户

return render_template('today.html',
        day_and_date = today,
        new_task_form = new_task_form,
        user_projects = projects,
        pending_tasks_length = pending_tasks_length,
        pending_tasks = pending_tasks)

您想要做的事情将需要一些 JavaScript,因为 Flask 无法自行完成此操作。 我建议阅读这个答案:https://stackoverflow.com/a/62081993/22796342 他们提供了这个代码:

form.addEventListener('submit', function(event) {
        event.preventDefault();    // prevent page from refreshing
        const formData = new FormData(form);  // grab the data inside the form fields
        fetch('/', {   // assuming the backend is hosted on the same server
            method: 'POST',
            body: formData,
        }).then(function(response) {
            // do something with the response if needed.
            // If you want the table to be built only after the backend handles the request and replies, call buildTable() here.
        });
    });
© www.soinside.com 2019 - 2024. All rights reserved.