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

Django项目模板无法渲染OneToOne关联的Passport模型数据如何解决

问题原因梳理

    1. citizen视图没有向模板传递Passport对象,模板中直接调用passport变量属于未定义变量,自然无法渲染内容
    1. 你已经通过OneToOneField建立了两个表的关联,完全可以通过Citizen对象直接访问关联的Passport属性,不需要额外查询Passport表
    1. 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  # 新增这行,传入关联的护照对象
    })

修改后原来的模板代码不需要调整即可正常渲染。

可选优化建议

  1. 可将Citizen模型中关联Passport的字段sID重命名为passport,语义更清晰,调用时citizen.passport.pType也更易读
  2. 若不需要单独的/passport路由,可删除对应的url配置和错误的passport视图函数,避免后续误调用报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 19:15:03