Django表单提交后如何重定向回同一页面?附相关功能代码示例
Django表单提交后重定向回同一页面解决方案
你当前的问题主要是逻辑分散、模板变量冲突、缺少必填的csrf校验,按以下步骤修改即可:
1. 核心逻辑调整(views.py)
建议将时间段提交逻辑合并到页面渲染视图view_available_food中,避免多路由维护:
@login_required def view_available_food(request): # 保留你原有获取food对象的逻辑,比如: # food = FoodAvail.objects.get(author=request.user) # 初始化时间段表单 time_slot_form = TimeSlotForm() # 处理POST提交请求 if request.method == "POST": if not check_existing_timeslot(request): data = request.POST.copy() data["time_slot_owner"] = request.user time_slot_form = TimeSlotForm(data) if time_slot_form.is_valid(): time_slot_form.save() # 提交成功直接重定向到当前页面路由 return redirect("food_avail:view_food_avail_res") else: # 注意你原有代码这里打印内容写反了,已存在才进入else分支 messages.info(request, "时间段已存在") # 获取当前用户已添加的所有时间段,用于列表展示 user_time_slots = TimeSlot.objects.filter(time_slot_owner=request.user) return render(request, "food_avail/view_food.html", { "food": food, # 保留原有food变量传递 "time_slot_form": time_slot_form, "time_slot_list": user_time_slots })
修改后可以删除原来单独的post_available_timeslots视图。
2. 模板修复(HTML)
2.1 表单部分添加csrf校验,替换表单变量
<form method="post"> {% csrf_token %} <!-- Django POST请求必须加的csrf校验标签 --> {{ time_slot_form.as_p }} <button type="submit" class="button btn-success">提交</button> </form>
2.2 时间段列表部分替换变量,避免冲突
{% if time_slot_list %} <h4>已添加的时间段列表</h4> </div> <div class="card-body"> <div class="table-responsive"> <table class="table table-hover "> <thead> <tr> <th>开始时间</th> <th>结束时间</th> <th>编辑</th> <th>删除</th> </tr> </thead> <tbody> {% for x in time_slot_list %} <tr> <td>{{x.start_time | time:'H:i:s'}}</td> <td>{{x.end_time | time:'H:i:s'}}</td> <td><!-- 后续自行补充编辑按钮逻辑 --></td> <td><!-- 后续自行补充删除按钮逻辑 --></td> </tr> {% endfor %} </tbody> </table> </div> </div> {% endif %}
3. 路由配置(urls.py)
不需要额外调整原有路由,保持food_avail_res路由指向修改后的view_available_food视图即可。
修改完成后,表单提交成功会自动重定向回当前页面,同时加载最新的时间段列表。
内容的提问来源于stack exchange,提问作者ailsin
相关产品推荐
相关产品推荐

