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

如何在Django视图间传递值?尝试会话存储时出现序列化错误

问题解决:Django Session存储Model实例导致JSON序列化错误

报错原因

model_instance.name是Model_Model模型的实例对象(而非字符串、数字等基础可序列化类型),Django Session默认采用JSON序列化存储数据,无法直接处理复杂的Model实例,因此抛出TypeError: Object of type Model_Model is not JSON serializable错误。

解决方案

将Model实例转换为可序列化的基础类型(如主键ID、字符串)存入Session,后续视图再根据该值还原对象或直接使用。

修改后的代码

view_1:存储可序列化的值

def form_1(request):
    context = {}
    form_2 = Form_new_form1_1(request.POST or None)
    if form_2.is_valid():
        model_instance = form_2.save(commit=False)
        # 方案1:存储关联对象的主键ID(推荐,便于后续查询原对象)
        nm_kot = model_instance.name.id
        # 方案2:存储对象的字符串表示(仅需展示文本时使用)
        # nm_kot = str(model_instance.name)
        
        request.session['nm_kot'] = nm_kot
        return redirect("form_1_2")
    
    context['form_2'] = form_2
    return render(request, "form_1.html", context)

view_2:读取Session并处理

def form_1_2(request):
    # 先判断Session是否存在,避免KeyError
    nm_kot = request.session.get('nm_kot')
    if not nm_kot:
        # Session过期或不存在时的回退处理,比如重定向回表单页
        return redirect("form_1")
    
    # 如果存储的是ID,查询原Model实例
    name_instance = Model_Model.objects.get(id=nm_kot)
    # 后续可根据需求传递值到下一个视图,比如通过URL参数
    return redirect("tabl_1", name=name_instance.name)

补充说明

  • 若你的name字段本身是CharField等字符串类型却返回Model实例,需检查表单或模型定义是否存在字段名冲突、关联错误等问题。
  • Session存储的内容会随用户会话结束过期,若需长期保存数据,可考虑存入数据库;若数据非敏感,也可直接作为URL参数传递。

内容的提问来源于stack exchange,提问作者Cristensen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 16:37:33