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

Django模板中通过模型字段作为字典键取值为空的问题及解决方法

问题分析与解决方案

嘿,这个问题我太熟了!咱们先拆解一下你遇到的问题,再一步步解决它:

为什么原来的写法不生效?

你用{% with cid=competency.id %}定义了变量cid,然后尝试用scoredict.cid取值——这里的坑在于:Django模板的点号(.)访问字典时,只会把后面的内容当作字符串字面量。也就是说,scoredict.cid其实是在找字典里键名为"cid"的元素,而不是用变量cid的值(比如8)作为键去查找。这就是为什么当competency.id是8时,你拿不到scoredict[8]的值,因为你的字典里根本没有"cid"这个键。

正确的解决方法

有两种简单的方式实现你想要的「用变量作为字典键」的需求:

方法1:使用字典的get方法

Django模板支持调用字典的get方法,这个方法可以接受变量作为参数,完美匹配你的需求:

{% for competency in domain.competency_set.all %}
    <td>
        {{ competency.id }} 
        {{ scoredict.8 }}
        {% with cid=competency.id %}
            {{ scoredict.get(cid) }}
            <!-- 可选:如果键不存在,返回默认值,比如 {{ scoredict.get(cid, "未评分") }} -->
        {% endwith %}
    </td>
{% endfor %}

get方法的好处是,如果键不存在,不会抛出模板错误,只会返回空字符串(或者你指定的默认值)。

方法2:使用方括号访问(Django 1.11+支持)

从Django 1.11版本开始,模板支持用方括号[]来通过变量访问字典的键,写法更直观:

{% for competency in domain.competency_set.all %}
    <td>
        {{ competency.id }} 
        {{ scoredict.8 }}
        {% with cid=competency.id %}
            {{ scoredict[cid] }}
        {% endwith %}
    </td>
{% endfor %}

注意:如果cid对应的键不存在于scoredict中,这种写法会抛出模板错误,所以如果你的字典可能缺少某些键,更推荐用get方法。

额外说明

你提到想实现类似scoredict.(competency.id)的强制求值写法,上面两种方法其实就是等价的实现——它们都先计算出competency.id的值,再用这个值去字典里查找对应的元素,完美解决了求值顺序的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:05:52