You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask待办应用中编辑任务Modal无法弹出问题求助

Flask待办应用编辑任务Modal无法弹出的问题排查与修复

我在开发Flask待办事项应用时,遇到编辑任务的Modal点击后无法弹出的问题,其他功能的Modal正常工作,以下是相关代码及问题分析与修复方案:


一、相关源码

1. 编辑任务Modal的HTML代码

<!-- Edit Task Modal -->
<div class="modal fade" id="editTaskModal" tabindex="-1" aria-labelledby="editTaskModalLabel" aria-hidden="true">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <h5 class="modal-title" id="editTaskModalLabel">Edit Task</h5>
                <button type="button" class="btn-close" data-dismiss="modal" aria-label="Close"></button>
            </div>
            <div class="modal-body">
                <!-- <form method="post" action="/edit_task" id="editTaskForm"> -->
                    
                    <form method="post" action="/edit_task/{{ task_for_modal.id }}">
                        {{ form.hidden_tag() }}
                        <div class="mb-3">
                            <label for="taskText" class="form-label">Task</label>
                            <input type="text" class="form-control" id="taskText" name="task" value="{{ task_for_modal.task }}" required>
                        </div>
                        <div class="mb-3">
                            <label for="description" class="form-label">Description</label>
                            <textarea class="form-control" id="description" rows="3" name="description">{{ task_for_modal.description }}</textarea>
                        </div>
                        <div class="mb-3">
                            <label for="dueDate" class="form-label">Due Date</label>
                            <input type="date" class="form-control" id="dueDate" name="due_date" value="{{ task_for_modal.due_date|default('') }}">
                        </div>
                        <div class="mb-3">
                            <label for="dueTime" class="form-label">Due Time</label>
                            <input type="time" class="form-control" id="dueTime" name="due_time" value="{{ task_for_modal.due_time|default('') }}">
                    </div>
                        <div class="mb-3">
                            <label for="priority" class="form-label">Priority</label>
                            <select class="form-select" id="priority" name="category">
                                <option value="low" {% if task_for_modal.category == 'low' %}selected{% endif %}>Low</option>
                                <option value="medium" {% if task_for_modal.category == 'medium' %}selected{% endif %}>Medium</option>
                                <option value="high" {% if task_for_modal.category == 'high' %}selected{% endif %}>High</option>
                            </select>
                        </div>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-secondary" data-mdb-dismiss="modal">Close</button>
                    <button type="submit" class="btn btn-primary">Update Task</button>
                </div>
                </form>
            </div>
        </div>
    </div>
</div>

2. 触发Modal的按钮代码

<div class="ms-3">
    <a href="#" class="text-info edit-task-button" data-mdb-toggle="modal" data-mdb-target="#editTaskModal" data-task-id="{{ task.id }}">
        <i class="fas fa-pencil-alt"></i> Edit
    </a>
</div>

3. Flask编辑任务视图代码

@app.route("/edit_task/<int:task_id>", methods=['GET', 'POST'])
@login_required
def edit_task(task_id):
    task = Task.query.get_or_404(task_id)

    form = TaskForm()
    if form.validate_on_submit():
        task.task = form.task.data
        task.description = form.description.data
        task.due_date = form.due_date.data
        task.due_time = form.due_time.data
        task.category = form.category.data

        db.session.commit()

        flash('Task has been updated successfully!', 'success')
        return redirect(url_for('dashboard'))

    # Pre-fill the form fields with the existing task data
    form.task.data = task.task
    form.description.data = task.description
    form.due_date.data = task.due_date
    form.due_time.data = task.due_time
    form.category.data = task.category

    return render_template('dashboard.html', task=task, form=form, current_user=current_user)

4. 触发事件的JavaScript代码

<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-HwwvtgBNo3bZJJLYd8oVXjrBZt8cqVSpeBNS5n7C8IVInixGAoxmnlMuBnhbgrkm" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/mdb-ui-kit/6.4.1/mdb.min.js"></script>
<script>
    $(document).ready(function() {
        $('[data-mdb-toggle="tooltip"]').tooltip();

        $('.edit-task-button').click(function() {
            var taskId = $(this).data('task-id');
            var task = getTaskById(taskId);
            fillEditTaskForm(task);
        });

        $('.delete-task-button').click(function() {
            var taskId = $(this).data('task-id');
            $('#confirmDeleteTask').attr('href', '/delete_task/' + taskId);
        });

        $('#editTaskModal').modal('show');

        function getTaskById(taskId) {
            return {
                id: taskId,
                task: "Task Name",
                description: "Task Description",
                due_date: "2023-08-15",
                due_time: "12:00",
                category: "high"
            };
        }

        function fillEditTaskForm(task) {
            $('#taskText').val(task.task);
            $('#description').val(task.description);
            $('#dueDate').val(task.due_date);
            $('#dueTime').val(task.due_time);
            $('#priority').val(task.category);
            $('#editTaskModal').modal('show');
        }
    });
</script>

二、问题分析

  1. HTML结构错误:Modal内标签嵌套混乱,form起始在modal-body内,但闭合标签在modal-footer之后,同时modal-body提前闭合,导致DOM结构异常,直接破坏Modal渲染逻辑。
  2. 模板变量不匹配:Flask视图传递的变量是task,但Modal中使用task_for_modal,模板渲染时变量未定义,导致表单数据无法填充,甚至破坏HTML结构。
  3. 事件冲突与默认行为未阻止:触发按钮是<a>标签,href="#"会触发锚点跳转,干扰Modal弹出;同时混合使用Bootstrap的data-dismiss="modal"和MDB的data-mdb-*属性,引发组件冲突。
  4. JS逻辑冗余:页面加载时强制调用$('#editTaskModal').modal('show'),干扰后续点击事件;且getTaskById返回硬编码假数据,无法获取真实任务信息。

三、修复方案

1. 修正HTML结构与属性

调整标签嵌套,确保form包裹完整表单内容,统一使用MDB属性:

<!-- 修复后的Edit Task Modal -->
<div class="modal fade" id="editTaskModal" tabindex="-1" aria-labelledby="editTaskModalLabel" aria-hidden="true">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <h5 class="modal-title" id="editTaskModalLabel">Edit Task</h5>
                <button type="button" class="btn-close" data-mdb-dismiss="modal" aria-label="Close"></button>
            </div>
            <form method="post" action="/edit_task/{{ task_for_modal.id }}">
                {{ form.hidden_tag() }}
                <div class="modal-body">
                    <div class="mb-3">
                        <label for="taskText" class="form-label">Task</label>
                        <input type="text" class="form-control" id="taskText" name="task" value="{{ task_for_modal.task }}" required>
                    </div>
                    <div class="mb-3">
                        <label for="description" class="form-label">Description</label>
                        <textarea class="form-control" id="description" rows="3" name="description">{{ task_for_modal.description }}</textarea>
                    </div>
                    <div class="mb-3">
                        <label for="dueDate" class="form-label">Due Date</label>
                        <input type="date" class="form-control" id="dueDate" name="due_date" value="{{ task_for_modal.due_date|default('') }}">
                    </div>
                    <div class="mb-3">
                        <label for="dueTime" class="form-label">Due Time</label>
                        <input type="time" class="form-control" id="dueTime" name="due_time" value="{{ task_for_modal.due_time|default('') }}">
                    </div>
                    <div class="mb-3">
                        <label for="priority" class="form-label">Priority</label>
                        <select class="form-select" id="priority" name="category">
                            <option value="low" {% if task_for_modal.category == 'low' %}selected{% endif %}>Low</option>
                            <option value="medium" {% if task_for_modal.category == 'medium' %}selected{% endif %}>Medium</option>
                            <option value="high" {% if task_for_modal.category == 'high' %}selected{% endif %}>High</option>
                        </select>
                    </div>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-secondary" data-mdb-dismiss="modal">Close</button>
                    <button type="submit" class="btn btn-primary">Update Task</button>
                </div>
            </form>
        </div>
    </div>
</div>

2. 修复触发按钮的默认行为

给<a>标签点击事件添加preventDefault(),阻止锚点跳转:

$('.edit-task-button').click(function(e) {
    e.preventDefault(); // 阻止默认跳转行为
    var taskId = $(this).data('task-id');
    var task = getTaskById(taskId);
    fillEditTaskForm(task);
});

3. 统一模板变量名

调整Flask视图传递的变量名,与Modal中的引用一致:

# 视图末尾修改返回参数
return render_template('dashboard.html', task_for_modal=task, form=form, current_user=current_user)

4. 优化JavaScript逻辑

移除页面加载时的强制弹出代码,清理冗余逻辑:

<script>
    $(document).ready(function() {
        $('[data-mdb-toggle="tooltip"]').tooltip();

        $('.edit-task-button').click(function(e) {
            e.preventDefault();
            var taskId = $(this).data('task-id');
            var task = getTaskById(taskId);
            fillEditTaskForm(task);
        });

        $('.delete-task-button').click(function() {
            var taskId = $(this).data('task-id');
            $('#confirmDeleteTask').attr('href', '/delete_task/' + taskId);
        });

        function getTaskById(taskId) {
            // 建议替换为AJAX请求真实数据
            return {
                id: taskId,
                task: "Task Name",
                description: "Task Description",
                due_date: "2023-08-15",
                due_time: "12:00",
                category: "high"
            };
        }

        function fillEditTaskForm(task) {
            $('#taskText').val(task.task);
            $('#description').val(task.description);
            $('#dueDate').val(task.due_date);
            $('#dueTime').val(task.due_time);
            $('#priority').val(task.category);
            $('#editTaskModal').modal('show');
        }
    });
</script>

内容的提问来源于stack exchange,提问作者Talemwa Eria Jackson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 23:27:03