Django表单提交数据未在目标页面显示问题求助
问题排查与修复
核心问题分析
- 表单提交目标错误:你的表单
action指向了order视图,但表单处理逻辑(验证、添加数据到orders_stock)在form视图里。提交后直接进入order视图,完全没经过数据处理步骤,自然看不到新增数据。 - 重定向路径错误:
form视图中处理完表单后,重定向到了模板文件路径form/orders.html,这不是正确的URL跳转方式,应该指向order视图的路由。 - 表单无效时的响应缺失:表单验证失败时,没有把错误的表单对象返回给页面,用户无法看到验证错误提示。
分步修复
1. 修正表单提交目标(form.html)
把表单的action改为指向处理逻辑所在的form视图:
<form action="{% url 'formsubmit:form'%}" method="post"> {% csrf_token %} {{form}} <input type="submit" value="Submit"> </form>
2. 修正视图中的重定向逻辑(views.py)
首先导入reverse用于生成正确的URL,然后修改表单处理完成后的重定向代码,同时修复表单无效时的响应:
from django.shortcuts import render, HttpResponseRedirect, reverse # 新增reverse导入 from django import forms # Create your views here. orders_stock = ['headphones', 'earbuds', 'diy tools'] class NewOrder(forms.Form): get_order = forms.CharField(label='Your order', max_length=50) def form(request): if request.method == 'POST': item = NewOrder(request.POST) if item.is_valid(): get_order = item.cleaned_data['get_order'] orders_stock.append(get_order) # 重定向到order视图的URL,而不是模板路径 return HttpResponseRedirect(reverse('formsubmit:order')) else: # 返回带错误信息的表单对象,而不是只传items return render(request, 'form/form.html', { 'form': item, 'items': orders_stock }) return render(request, 'form/form.html', { 'form': NewOrder() }) def order(request): return render(request, 'form/orders.html', { 'items': orders_stock, })
3. 额外优化(可选,但重要)
全局变量orders_stock在多用户访问时会出现数据混乱(比如多个用户提交的订单会互相覆盖或混合),建议使用**会话(session)**来存储用户专属订单:
def form(request): # 初始化session中的订单列表 if 'orders_stock' not in request.session: request.session['orders_stock'] = ['headphones', 'earbuds', 'diy tools'] if request.method == 'POST': item = NewOrder(request.POST) if item.is_valid(): get_order = item.cleaned_data['get_order'] request.session['orders_stock'].append(get_order) request.session.modified = True # 告诉Django session已修改 return HttpResponseRedirect(reverse('formsubmit:order')) else: return render(request, 'form/form.html', { 'form': item, 'items': request.session['orders_stock'] }) return render(request, 'form/form.html', { 'form': NewOrder(), 'items': request.session['orders_stock'] }) def order(request): # 确保session中有订单列表 if 'orders_stock' not in request.session: request.session['orders_stock'] = ['headphones', 'earbuds', 'diy tools'] return render(request, 'form/orders.html', { 'items': request.session['orders_stock'], })
验证修复效果
- 重启Django服务器
- 访问表单页面,提交订单
- 提交后会跳转到订单页面,此时能看到新增的订单数据
内容的提问来源于stack exchange,提问作者Errachdi
相关产品推荐
相关产品推荐

