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

Django如何不通过URL向新视图传递数据并区分按钮触发场景

解决方案

你的问题根源是两个按钮指向同一个路由,视图无法区分用户点击的是「Next」还是「New」,且session中存储的填充数据不会自动清空,导致两个场景都会自动填充字段。你可以通过添加无敏感信息的动作标记参数+session配合的方式实现需求,全程不会暴露p1/p2/p3的实际值:

1. 修改模板按钮链接

给两个按钮添加仅用于区分动作的查询参数,参数值仅为动作标记,不会暴露你要传递的业务变量:

<button type="button" class="btn btn-color rounded-1 pt-1 pb-1">
    <a class="nav-link btn-color" href="{% url 'add-paring-3' %}?action=next">Next</a>
</button>
<button type="button" class="btn btn-color rounded-1 pt-1 pb-1">
    <a class="nav-link btn-color" href="{% url 'add-paring-3' %}?action=new">New</a>
</button>

2. 修改AddParing3View的get逻辑

根据动作标记判断是否需要填充字段,同时修复原代码直接取session可能触发KeyError的问题:

class AddParing3View(View):
    def get(self, request):
        action = request.GET.get("action", "new")
        # 点New按钮:清空session数据,返回空白表单
        if action == "new":
            if "teamA3" in request.session:
                del request.session["teamA3"]
            form = ParingsForm()
        # 点Next按钮:从session取数据填充表单
        else:
            teamA = request.session.get("teamA3")
            if teamA:
                form = ParingsForm(initial={
                    "p1": teamA[0],
                    "p2": teamA[1],
                    "p3": teamA[2],
                })
            else:
                # 没有历史数据时回退到空白表单
                form = ParingsForm()
        ctx = {"form": form}
        return render(request, "add_paring_3_form.html", ctx)

3. 其余代码保持不变

你原来的ParingDetails3View中存储session的逻辑不需要修改,每次进入详情页都会把当前记录的p1/p2/p3写入session,确保点Next时填充的是当前页的对应字段值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 01:39:00