如何在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
相关产品推荐
相关产品推荐

