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
相关产品推荐
相关产品推荐

