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

基于Flask的票务预订网站:如何通过单表单添加指定数量乘客?

实现按指定数量收集乘客信息的Flask方案

原代码存在的核心问题

  1. 使用全局变量no_of_passengers:多用户场景下会互相覆盖,导致数据混乱。
  2. 表单仅显示单个乘客字段:无法一次性收集所有乘客信息,循环跳转的逻辑不符合用户操作习惯。
  3. 后端循环中提前return:导致只处理第一个乘客的信息就跳转,无法完成所有数据收集。
  4. 表单字段name重复:即使多次提交,后端也无法区分不同乘客的信息。

修正后的完整实现方案

1. 修改航班选择视图:用Session存储乘客数量

from flask import session, redirect, url_for, request, render_template

@views.route('/flight', methods=['GET', 'POST'])
def flight():
    if request.method == 'POST':
        # 将乘客数量存入Session,替代全局变量
        session['no_of_passengers'] = int(request.form.get('no_of_passengers'))
        # 直接跳转到乘客信息填写页面
        return redirect(url_for('views.passenger_information'))
    return render_template('flight.html')

2. 动态生成乘客信息表单模板

修改passengersinfo.html,根据乘客数量循环生成带索引的表单字段:

{% extends 'base.html'%}

{% block title %}乘客信息填写页{% endblock %}

{% block content %}
<form action="{{ url_for('views.passenger_information') }}" method='POST'>
    {% for i in range(no_of_passengers) %}
    <div style="border: 1px solid #eee; padding: 15px; margin: 10px 0; border-radius: 5px;">
        <h4>乘客 {{ i+1 }}</h4>
        
        <label for="Passenger_Name_{{i}}">姓名:</label>
        <input type="text" name="Passenger_Name_{{i}}" id="Passenger_Name_{{i}}" required>
        
        <br><br>
        <label for="Street_{{i}}">街道:</label>
        <input type="text" name="Street_{{i}}" id="Street_{{i}}" required>
        
        <br><br>
        <label for="City_{{i}}">城市:</label>
        <input type="text" name="City_{{i}}" id="City_{{i}}" required>
        
        <br><br>
        <label for="State_{{i}}">州/省份:</label>
        <input type="text" name="State_{{i}}" id="State_{{i}}" required>
        
        <br><br>
        <label for="Zip_{{i}}">邮政编码:</label>
        <input type="text" name="Zip_{{i}}" id="Zip_{{i}}" required>
    </div>
    {% endfor %}
    
    <button type="submit" style="padding: 8px 20px; background: #007bff; color: white; border: none; border-radius: 4px;">提交所有信息</button>
</form>
{% endblock %}

3. 修改乘客信息处理视图:一次性收集所有数据

@views.route('/passengersinfo', methods=['GET', 'POST'])
def passenger_information():
    # 从Session获取乘客数量,未获取到则跳回航班选择页
    no_of_passengers = session.get('no_of_passengers')
    if not no_of_passengers:
        return redirect(url_for('views.flight'))
    
    if request.method == 'POST':
        passengers_list = []
        # 循环提取每个乘客的信息
        for i in range(no_of_passengers):
            passenger = {
                'name': request.form.get(f'Passenger_Name_{i}'),
                'street': request.form.get(f'Street_{i}'),
                'city': request.form.get(f'City_{i}'),
                'state': request.form.get(f'State_{i}'),
                'zip_code': request.form.get(f'Zip_{i}')
            }
            passengers_list.append(passenger)
        
        # 这里可以添加保存到数据库、生成订单等业务逻辑
        print("已收集的乘客信息:", passengers_list)
        
        # 处理完成后可跳转到确认页或首页
        return "乘客信息提交成功!"
    
    # GET请求时,将乘客数量传给模板渲染表单
    return render_template('passengersinfo.html', no_of_passengers=no_of_passengers)

关键改进说明

  • Session存储状态:替代全局变量,确保每个用户的乘客数量独立,不会互相干扰。
  • 动态表单生成:通过Jinja2循环生成带索引的字段名,后端能精准区分每个乘客的信息。
  • 一次性提交:用户只需填写一次表单即可完成所有乘客信息提交,操作流程更顺畅。
  • 健壮性处理:增加Session不存在时的跳转逻辑,避免非法访问乘客信息页面。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 07:55:19