Django如何将模板传递到URL的参数传入类视图的form_valid方法
问题根源
问题本质是两次请求的参数隔离:
- 第一次从
data.html提交GET表单跳转至/next/页面时,job_id确实在GET查询参数里,这一步仅触发RunNextView的GET逻辑,渲染next.html的表单页面 - 你在
next.html提交RunForm时用的是POST请求,默认提交到/next/路径,不会携带之前URL里的查询参数,而form_valid仅在POST请求表单验证通过后触发,所以在该方法内自然无法从request.GET拿到job_id
另外注意你data.html里的隐藏job_id输入框要确保已经通过模板变量或者JS正确赋值,否则第一次GET提交也会传空值。
解决方案
方案1:把job_id嵌入到next.html的表单隐藏字段(最简便)
在next.html的<form>标签内新增隐藏输入框,从GET参数里读取job_id渲染进去:
<input type="hidden" name="job_id" value="{{ request.GET.job_id }}">
之后在form_valid里直接从POST参数取值即可:
job_id = self.request.POST.get('job_id')
方案2:把job_id放到URL路径中(更符合Django规范)
修改urls.py的路由规则,把job_id作为路径参数:
path('next/<int:job_id>/', RunNextView.as_view(), name='next'),
对应修改data.html里的表单提交地址,渲染URL的时候传入job_id变量:
<form method="GET" action="{% url 'data:next' job_id=你的job_id变量 %}">
之后在form_valid里可以直接从视图的kwargs取值:
job_id = self.kwargs.get('job_id')
方案3:临时存入session
在RunNextView的dispatch方法里先判断如果是GET请求,就把job_id存入session:
def dispatch(self, request, *args, **kwargs): if not request.user.is_authenticated: return redirect(reverse_lazy('account:login')) # 存储job_id到session if request.method == 'GET' and 'job_id' in request.GET: request.session['job_id'] = request.GET.get('job_id') return super(RunNextView, self).dispatch(request, *args, **kwargs)
之后在form_valid里从session取:
job_id = self.request.session.get('job_id') # 用完可删除避免残留 del self.request.session['job_id']
内容的提问来源于stack exchange,提问作者Enric
相关产品推荐
相关产品推荐

