如何在Django视图中循环获取N次request.POST中的两组值
解决Django中循环N次获取用户手动输入值的问题
原代码存在的核心问题
- 全局变量
peso_unitario和preco_unitario在多用户场景下会互相覆盖,完全不可用于生产环境。 - HTTP是无状态协议,单个请求无法等待用户完成多次输入,原代码循环内直接
return会导致第一次请求就中断流程,无法完成N次输入。 - 未处理GET请求,首次访问该视图会直接报错。
解决方案:用Django Session存储输入进度
利用Session保存用户专属的输入进度和已提交的数据,每次请求仅处理一组输入,逐步完成N次提交流程。
修改后的views.py代码
def valores(request): # 从Session获取预设的N值(需提前在其他视图中存入,比如request.session['a'] = 目标次数) N = request.session.get('a') if not N: return render(request, 'pacote.html', {'res': 'N值未设置,请先完成初始配置。'}) # 首次访问(GET请求):初始化输入进度 if request.method == 'GET': request.session['current_step'] = 0 request.session['peso_unitario'] = [] request.session['preco_unitario'] = [] return render(request, 'valores.html', {'current_step': 1, 'total_steps': N}) # 处理POST提交的输入 current_step = request.session.get('current_step', 0) peso_unitario = request.session.get('peso_unitario', []) preco_unitario = request.session.get('preco_unitario', []) # 获取表单输入值 peso_u = request.POST.get('peso_u', '') preco_u = request.POST.get('preco_u', '') # 验证输入是否为纯数字 if not peso_u.isdigit() or not preco_u.isdigit(): return render(request, 'valores.html', { 'res': 'Apenas numero.', 'current_step': current_step + 1, 'total_steps': N }) # 保存当前输入 peso_unitario.append(int(peso_u)) preco_unitario.append(int(preco_u)) current_step += 1 # 更新Session中的进度数据 request.session['peso_unitario'] = peso_unitario request.session['preco_unitario'] = preco_unitario request.session['current_step'] = current_step # 判断是否完成所有输入 if current_step < N: # 未完成,返回输入页面并提示当前步骤 return render(request, 'valores.html', { 'current_step': current_step + 1, 'total_steps': N }) else: # 完成所有输入,清空临时Session数据,跳转结果页 peso_final = request.session.pop('peso_unitario') preco_final = request.session.pop('preco_unitario') request.session.pop('current_step') return render(request, 'pacote.html', { 'peso_unitario': peso_final, 'preco_unitario': preco_final })
配套的valores.html模板
模板需要显示当前输入步骤,让用户明确进度:
<!-- valores.html --> <!DOCTYPE html> <html> <head> <title>输入第{{ current_step }}/{{ total_steps }}组数据</title> </head> <body> {% if res %} <p style="color: red;">{{ res }}</p> {% endif %} <h3>请输入第{{ current_step }}/{{ total_steps }}组数据</h3> <form method="post"> {% csrf_token %} <label>peso_u: <input type="text" name="peso_u" required></label><br> <label>preco_u: <input type="text" name="preco_u" required></label><br> <button type="submit">提交</button> </form> </body> </html>
关键注意事项
- 必须提前将
N(即原代码中的a)存入用户Session,比如在前置视图中执行request.session['a'] = 5(假设需要输入5组数据)。 - Session是用户隔离的,不会出现多用户数据互相覆盖的问题。
- 每次POST仅处理一组输入,完成后更新进度,直到达到N次后跳转结果页。
内容的提问来源于stack exchange,提问作者Lucas Felipe Casagrande de A.
相关产品推荐
相关产品推荐

