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_
相关产品推荐
相关产品推荐

