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

如何在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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 04:06:26