Django中点击Add按钮保存表单数据并返回上一页的实现求助
解决表单保存后返回上一页的问题
我来帮你搞定这个问题!你的代码里有几个关键问题导致功能失效,我一步步给你修正:
首先修正模板文件(template.html)
原模板里的表单结构有问题——name="next"的隐藏输入框和提交按钮都放在了<form>标签外面,这会导致表单提交时无法携带这些数据,而且HTML结构也不合法。调整后的代码如下:
<div class="panel panel-default"> <div class="panel-heading"> <h3 class="panel-title">Add your own Category</h3> </div> <div class="panel-body"> <form method="POST" class="post-form"> {% csrf_token %} {{ form.as_p }} <!-- 把隐藏输入框和按钮移到form内部 --> <input type="hidden" name="next" value="{{ request.META.HTTP_REFERER }}"> <button type="submit" class="save btn btn-default">Add</button> </form> </div> </div>
这里把next的值改成了request.META.HTTP_REFERER,它会直接获取上一页的URL,比用request.path更准确,当然如果你有特定需求也可以改回原来的写法。
然后修正视图文件(views.py)
原视图的写法完全不符合CreateView的规范,你在form_valid里嵌套了一个无用的category函数,这根本不会执行。正确的做法是重写form_valid方法,完成数据保存后,根据next参数重定向:
from django.views.generic.edit import CreateView from django.contrib.auth.mixins import LoginRequiredMixin from django.http import HttpResponseRedirect from .models import Category from .forms import CategoryForm class CustomCategory(LoginRequiredMixin, CreateView): model = Category form_class = CategoryForm def form_valid(self, form): # 保存表单数据 obj = form.save(commit=False) # 如果你需要给对象添加额外字段(比如关联当前用户),可以在这里操作 # obj.user = self.request.user obj.save() # 获取next参数,默认重定向到首页 next_url = self.request.POST.get('next', '/') return HttpResponseRedirect(next_url)
关键说明
- 模板结构修正:确保所有表单相关元素都在
<form>标签内部,否则浏览器不会把它们作为表单数据提交。 - 视图逻辑修正:
CreateView的form_valid方法默认会重定向到新建对象的详情页,我们重写它来实现自定义的重定向逻辑,先保存数据,再根据next参数跳回上一页。 next参数的获取:用request.POST.get('next', '/')可以避免next参数不存在时出现错误,默认跳转到首页。
这样修改后,点击“Add”按钮就能正确保存表单数据,然后自动返回上一页啦!
内容的提问来源于stack exchange,提问作者user
相关产品推荐
相关产品推荐

