Html 表单(弹出)与 javascript 和烧瓶

Html form (popup) with javascript and flask

我正在尝试创建一个简单的 todo flask 应用程序。它与包含列 id、内容(任务)和状态(待办事项、进度、完成)的数据库链接。我添加了添加新任务、删除任务以及使用按钮更新其状态等功能。

我正在尝试通过弹出窗体添加“编辑任务”按钮。我混合使用了 html/css/javascript 来显示这个弹出窗口,它运行良好,但我遇到了 Jinja 调用的问题(见下文)。

在html中有一个for循环来显示所有的任务,每个任务旁边都有更新任务状态、编辑任务和删除它们的按钮(见下图)

这是html

{% for task in tasks %}
            <div class="flex-row">
                <p class="task">{{ task.content }}</p>

                <!--Update task status option-->
                <form action="{{ url_for('update_task_status', task_id=task.id) }}" method="POST">
                    <button type="submit" class="btn-{{ task.status }}">{{ task.status }}</button>
                </form>

                <!-- Edit task option-->
                <button class="btn-edit" onclick="openForm()"><i class="fa fa-edit"></i></button>
                <div class="form-popup" id="myForm">
                    <form action="{{ url_for('edit_task', task_id=task.id) }}" class="form-container" method="POST">
                        <label for="Task_edit"><b>Edit task</b></label>
                        <input type="text" value="{{ task.content }}" name="Task_edit" required>
                        <button type="submit" class="btn">Edit</button>
                        <button type="button" class="btn cancel" onclick="closeForm()">Close</button>
                    </form>
                </div>

                <!-- Delete task option-->
                <form action="{{ url_for('delete_task', task_id=task.id) }}" method="POST" onsubmit="return confirmDelete()">
                    <button type="submit" class="btn-delete"><i class="fa fa-trash"></i></button>
                </form>
            </div>
            <hr class="line">
{% endfor %}

Javascript:

function openForm() {
   document.getElementById("myForm").style.display = "block";
}

function closeForm() {
   document.getElementById("myForm").style.display = "none";
}

css:

/* The popup form - hidden by default */
.form-popup {
  display: none;
  ...
}

除“编辑任务选项”(html 中的部分)外,一切正常,其中 {{ task.id }} Jinja 调用确实仅指第一个任务,无论我单击的是什么编辑按钮上。

我不明白,因为它适用于删除按钮(点击任务 2 的删除按钮将给出 task.id = 2)。 我怀疑 javascript 函数与 html 交互并阻止 Jinja 获得正确的任务 ID,我不知道如何解决这个问题?

我知道如何通过将 flask 路由到另一个 html 页面来执行此“编辑任务”选项,但我想使用此弹出表单来执行此操作。

有人能帮帮我吗?

非常感谢!

我认为您有多个具有相同 ID 的项目。您的 javascript 函数总是打开第一个命中。所以它总是第一个条目的形式。

我的建议是在标识中包含任务ID。那么每个元素都有一个唯一的id,可以唯一引用

<button onclick="openForm(event)" data-target="#form-{{ task.id }}"><i class="fa fa-edit"></i></button>
<div class="form-popup" id="form-{{ task.id }}">
  <form>
    <!-- ... -->
    <button type="button" onclick="closeForm(event)" data-dismiss=".form-popup">Close</button>
  </form>
</div>
function openForm(event) {
  const target = event.target.dataset.target;
  const elem = document.querySelector(target);
  elem && (elem.style.display = 'block');
}

function closeForm(event) {
  const target = event.target.dataset.dismiss;
  const elem = event.target.closest(target);
  elem && (elem.style.display = 'none');
}