基于Flask的票务预订网站:如何通过单表单添加指定数量乘客?
实现按指定数量收集乘客信息的Flask方案
原代码存在的核心问题
- 使用全局变量
no_of_passengers:多用户场景下会互相覆盖,导致数据混乱。 - 表单仅显示单个乘客字段:无法一次性收集所有乘客信息,循环跳转的逻辑不符合用户操作习惯。
- 后端循环中提前
return:导致只处理第一个乘客的信息就跳转,无法完成所有数据收集。 - 表单字段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
相关产品推荐
相关产品推荐

