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

Flask+Bootstrap5实现合法输入条件下弹出删除确认模态框

问题描述

我正在使用Flask和Bootstrap 5开发一款记账本应用,当前开发删除功能:用户输入要删除的记录数,合法输入时弹出包含对应行信息的确认模态框;若输入非法(非整数或超过现有记录数),则通过Flask Flash展示错误提示。现有问题是无论输入是否合法都会弹出模态框,而Flash提示在提交后生成,希望实现条件模态框:合法输入弹模态框,非法则提交并显示错误。

现有代码

HTML部分

<form class="col-md-3" method="POST" autocomplete="off">
  <div class="card">
    <div class="card-body">
      <div>
        <label for="deleteform" class="d-inline">number to delete</label>
        <input type="text" class="form-control" id="delete_number" name="delete_number" value="1" onchange="myFunction()">
        <button type="button" class="btn" id="delete_btn">delete</button>            
      </div>
    </div>
  </div>
  <div class="modal fade" id="confirm_modal" tabindex="-1" aria-hidden="true">
    <div class="modal-dialog">
      <div class="modal-content">
        <div class="modal-header">
          <h5 class="modal-title">Delete <span id="num_to_delete"></span>records</h5>
          <button type="button" class="btn-close"  data-bs-dismiss="modal" aria-label="Close"></button>
        </div>
        <div class="modal-body">
          <p><span id="row_text"></span></p>
        </div>
        <div class="modal-footer">
          <button type="button" class="btn btn-light" data-bs-dismiss="modal">cancel</button>
          <button type="submit" class="btn btn-color"  id='delete_entry' name="delete_entry" value="cancel">delete</button>
        </div>
      </div>
    </div>
  </div>
</form>

JS部分

// 从后端模板传入的总记录数与记录数据
const totalRecords = {{ total_records }};
const obj = {{ obj|tojson }};
const size = obj.length;

let number = document.getElementById('delete_number').value;
document.getElementById("num_to_delete").innerText = number;
let get_row = obj[size - Number(number)];
document.getElementById("row_text").innerText = create_text(get_row);

function myFunction() {
    number = document.getElementById('delete_number').value;
    document.getElementById("num_to_delete").innerText = number;
    get_row = obj[size - Number(number)];
    document.getElementById("row_text").innerText = create_text(get_row);
}

// 新增删除按钮点击事件处理
document.getElementById('delete_btn').addEventListener('click', function() {
    const inputNum = document.getElementById('delete_number').value;
    // 验证输入是否为正整数且不超过总记录数
    if (!/^\d+$/.test(inputNum)) {
        document.querySelector('form').submit();
        return;
    }
    const num = parseInt(inputNum);
    if (num <= 0 || num > totalRecords) {
        document.querySelector('form').submit();
        return;
    }
    // 输入合法,手动打开模态框
    const modal = new bootstrap.Modal(document.getElementById('confirm_modal'));
    modal.show();
});

// 生成模态框内容的函数(根据实际业务调整)
function create_text(row) {
    return `记录:日期${row.date},金额${row.amount}`;
}

Python代码(Flash逻辑)

from flask import request, flash, render_template
import pickle

# 加载现有记录
with open('file.pkl', 'rb') as f:
    list_of_sheets = pickle.load(f)

@app.route('/record', methods=['GET', 'POST'])
def record_page():
    total_records = len(list_of_sheets)
    obj = list_of_sheets
    if request.method == 'POST':
        num = request.form.get('delete_number')
        if num != "":
            if num.isdigit():
                num = int(num)
                if num <= total_records:
                    # 删除最后n条记录
                    list_of_sheets = list_of_sheets[:total_records - num]
                    with open('file.pkl', 'wb') as f:
                        pickle.dump(list_of_sheets, f)
                    flash('删除成功', category='success')
                else:
                    flash('错误:输入的记录数超过现有数量', category='error')
            else:
                flash('错误:请输入有效的正整数', category='error')
        else:
            flash('错误:输入不能为空', category='error')
        return render_template('record.html', total_records=len(list_of_sheets), obj=obj)
    return render_template('record.html', total_records=total_records, obj=obj)

关键修改说明

  • 按钮逻辑调整:移除按钮自带的模态框触发属性,改为绑定自定义点击事件,实现条件触发。
  • 前端验证:在点击事件中先校验输入格式与范围,非法输入直接提交表单触发后端Flash提示;合法输入则手动打开模态框。
  • 后端数据传递:渲染模板时将总记录数、记录数据传给前端,供JS做验证与模态框内容生成。
  • 后端二次校验:保留原有后端验证逻辑,避免前端验证被绕过,确保数据操作安全。

内容的提问来源于stack exchange,提问作者Leciomafe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 21:21:01