Django模板循环中如何通过循环变量获取字典对应动态键的值
问题核心原因
Django模板引擎的点号(.)查找逻辑不会做动态变量解析,只会做字面匹配:
- 当你写
{{ domain_dict.6 }}时,引擎会识别.6是数字字面量,自动转成整数键,去domain_dict里找键为6的条目,所以能正常返回结果。 - 当你写
{{ domain_dict.domain_id }}时,引擎会把domain_id当成字面的字符串键名,去domain_dict里找键为字符串"domain_id"的条目——这个键根本不存在,自然返回空值,完全不会读取你在{% with %}块里定义的domain_id变量的实际取值。
可落地的解决方法
方法1(最稳妥,无版本依赖,推荐):视图层预先绑定对应值
完全规避模板里的动态字典查找逻辑,在后端拿到domain_dict之后,直接把对应的值挂到每个循环遍历的domain对象上,从根源减少模板逻辑复杂度:
def get(self, request, *args, **kwargs): domains = Domain.objects.all() domain_dict = {} # ... 原有domain_dict处理逻辑 # 给每个domain实例绑定对应的字典内容 for domain in domains: domain.content = domain_dict.get(domain.id, '') context = { 'domains': domains } return render(request, self.response_template, context)
模板里直接读取绑定好的属性即可:
<div class="col-md-8"> <div class="tab-content"> {% for domain in domains %} <div class="tab-pane container p-0 {% if forloop.first %} active {% endif %}" id="services{{domain.id}}"> <div class="img" style="background-image: url('static/counsellor/images/service-1.png');"> </div> <h3><a href="#">Name: {{domain.name}} ID: {{domain.id}}</a></h3> <p>{{ domain.content }}</p> </div> {% endfor %} </div> </div>
方法2:高版本Django用内置标签实现动态取值
如果你使用的是Django 3.2及以上版本,可以用内置的{% at_index %}标签直接实现动态索引取值,不需要写额外的自定义逻辑:
<div class="col-md-8"> <div class="tab-content"> {% for domain in domains %} {% with domain_id=domain.id %} <div class="tab-pane container p-0 {% if forloop.first %} active {% endif %}" id="services{{domain.id}}"> <div class="img" style="background-image: url('static/counsellor/images/service-1.png');"> </div> <h3><a href="#">Name: {{domain.name}} ID: {{domain_id}}</a></h3> {% at_index domain_dict domain_id as domain_content %} <p>{{ domain_content }}</p> </div> {% endwith %} {% endfor %} </div> </div>
内容的提问来源于stack exchange,提问作者Md. Imrul Hasan
相关产品推荐
相关产品推荐

