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

Flask+SQLAlchemy货运预约CRUD应用添加历史记录页问题

货运预约CRUD应用日程变更记录功能问题

我开发了一个管理货运预约的CRUD应用,想要新增一个页面展示最近10条日程变更记录。逻辑是:当预约被创建/更新/删除时,把该预约相关数据存入新的数据库表,然后在History路由页面展示这个表的最新10条记录。但我尝试在各视图函数里添加二次提交,却无法向新表写入数据,现有代码如下:

class appts_db(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    carrier = db.Column(db.String(100), nullable=False)
    volume = db.Column(db.Integer)
    pickup_date = db.Column(db.String(10))

class log_db(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    appt_id = db.Column(db.Integer, db.ForeignKey('appts_db.id'))
    modified_on = db.Column(db.DateTime, default=datetime.now)
    action = db.Column(db.String(7))

@app.route('/create', methods=['GET', 'POST'])
def create():
    if request.method == 'POST':
        carrier_name = request.form['carrier']
        requested_volume = request.form['volume']
        pickup_date_input = request.form['pickup_date']

        new_appt = appts_db(carrier=carrier_name, volume=requested_volume,
            pickup_date=pickup_date_input)

        db.session.add(new_appt)
        db.session.commit()
        return redirect('/')

    else:
        return render_template('create.html')

@app.route('/update/<int:id>', methods=['GET', 'POST'])
def update(id):
    appt = appts_db.query.get_or_404(id)

    if request.method == 'POST':
        appt.carrier = request.form['carrier']
        appt.volume = request.form['volume_update']
        appt.pickup_date = request.form['pickup_date']

        db.session.commit()
        return redirect('/')
    
    else:
        return render_template('update.html', appt=appt)

@app.route('/delete/<int:id>')
def delete(id):
    appt_to_delete = appts_db.query.get_or_404(id)
    db.session.delete(appt_to_delete)
    db.session.commit()
    return redirect('/')

问题修复与功能实现

1. 完善日志表结构

当前log_db仅记录appt_id,若原预约被删除,关联信息会丢失。建议添加原预约关键字段到日志表,同时修正时间字段和动作字段的配置:

class log_db(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    appt_id = db.Column(db.Integer, db.ForeignKey('appts_db.id'))
    # 新增原预约关键信息字段
    carrier = db.Column(db.String(100))
    volume = db.Column(db.Integer)
    pickup_date = db.Column(db.String(10))
    # 使用SQLAlchemy内置函数处理时间,避免时区问题
    modified_on = db.Column(db.DateTime, default=db.func.now())
    # 扩展动作字段长度,支持完整动作描述
    action = db.Column(db.String(20))

2. 在各操作中添加日志记录

修改三个核心视图函数,在预约操作时同步写入日志:

@app.route('/create', methods=['GET', 'POST'])
def create():
    if request.method == 'POST':
        carrier_name = request.form['carrier']
        requested_volume = request.form['volume']
        pickup_date_input = request.form['pickup_date']

        new_appt = appts_db(carrier=carrier_name, volume=requested_volume,
            pickup_date=pickup_date_input)

        db.session.add(new_appt)
        db.session.commit()

        # 添加创建日志
        new_log = log_db(
            appt_id=new_appt.id,
            carrier=new_appt.carrier,
            volume=new_appt.volume,
            pickup_date=new_appt.pickup_date,
            action='创建'
        )
        db.session.add(new_log)
        db.session.commit()

        return redirect('/')
    else:
        return render_template('create.html')

@app.route('/update/<int:id>', methods=['GET', 'POST'])
def update(id):
    appt = appts_db.query.get_or_404(id)

    if request.method == 'POST':
        # 记录更新前的预约信息
        update_log = log_db(
            appt_id=appt.id,
            carrier=appt.carrier,
            volume=appt.volume,
            pickup_date=appt.pickup_date,
            action='更新'
        )
        db.session.add(update_log)

        # 更新预约信息
        appt.carrier = request.form['carrier']
        appt.volume = request.form['volume_update']
        appt.pickup_date = request.form['pickup_date']

        db.session.commit()
        return redirect('/')
    else:
        return render_template('update.html', appt=appt)

@app.route('/delete/<int:id>')
def delete(id):
    appt_to_delete = appts_db.query.get_or_404(id)

    # 先写入删除日志,保存预约原始信息
    delete_log = log_db(
        appt_id=appt_to_delete.id,
        carrier=appt_to_delete.carrier,
        volume=appt_to_delete.volume,
        pickup_date=appt_to_delete.pickup_date,
        action='删除'
    )
    db.session.add(delete_log)
    # 同时提交日志和删除操作
    db.session.delete(appt_to_delete)
    db.session.commit()

    return redirect('/')

3. 添加History路由与页面

新增路由查询最新10条日志,渲染展示页面:

@app.route('/history')
def history():
    # 按修改时间倒序,取最新10条记录
    recent_logs = log_db.query.order_by(log_db.modified_on.desc()).limit(10).all()
    return render_template('history.html', logs=recent_logs)

对应的history.html模板示例:

<h1>最近日程变更记录</h1>
<ul>
    {% for log in logs %}
    <li>
        {{ log.modified_on.strftime('%Y-%m-%d %H:%M') }} 
        - {{ log.action }} 预约:承运商{{ log.carrier }},货量{{ log.volume }},取货日期{{ log.pickup_date }}
    </li>
    {% endfor %}
</ul>

4. 数据库初始化

确保已创建日志表,可在Flask Shell中执行:

db.create_all()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 21:05:49