Django项目模板无法渲染OneToOne关联的Passport模型数据如何解决
问题原因梳理
citizen视图没有向模板传递Passport对象,模板中直接调用passport变量属于未定义变量,自然无法渲染内容
- 你已经通过OneToOneField建立了两个表的关联,完全可以通过Citizen对象直接访问关联的Passport属性,不需要额外查询Passport表
passport视图存在语法错误:函数参数中没有定义passport_id,直接调用Passport.objects.get(Number=passport_id)会直接报错,且当前该视图仅做重定向操作,没有实际传递数据的作用
修复方案
方案一(最简修改,仅改模板即可)
直接修改citizen.html中Passport部分的变量调用路径,通过Citizen的关联字段sID访问护照属性:
<h2>Passport:</h2> <ul> <li>Loại hộ chiếu: {{ citizen.sID.pType }} </li> <li>Số hộ chiếu: {{ citizen.sID.Number }}</li> <li>Thời hạn hiệu lực: {{ citizen.sID.validTime }}</li> </ul>
方案二(修改视图传递单独的passport变量)
修改views.py中的citizen视图,将关联的护照对象传入模板上下文:
def citizen(request, citizen_id): try: citizen = Citizen.objects.get(code=citizen_id) except Citizen.DoesNotExist: raise Http404("Citizen not found") return render(request, "citizens/citizen.html", { "citizen": citizen, "passport": citizen.sID # 新增这行,传入关联的护照对象 })
修改后原来的模板代码不需要调整即可正常渲染。
可选优化建议
- 可将Citizen模型中关联Passport的字段
sID重命名为passport,语义更清晰,调用时citizen.passport.pType也更易读 - 若不需要单独的
/passport路由,可删除对应的url配置和错误的passport视图函数,避免后续误调用报错
内容的提问来源于stack exchange,提问作者hoangphi01
相关产品推荐
相关产品推荐

