You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 11:15:06