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

如何在Django模板中通过动态键从字典获取值

问题:Django模板中通过动态键从字典取值

场景还原

Model定义

class StatusData(models.Model):
    app = models.CharField(max_length=35)
    status = models.CharField(max_length=3)  # 可选值:SNY,DVL,TST

    class Meta:
        managed = False

    def __str__(self):
        return self.status

View代码

all_choices = {'SNY':'Sanity', 'DVL':'Develop', 'TST':'Testing'}
model = StatusData.objects.order_by('-app') 

context = {
   "choices": all_choices,
   "modelData": model,
}

模板问题说明

原模板中尝试通过{{ choices.model.status }}获取动态键对应的值,但无法生效;硬编码{{ choices.SNY }}可正常取值。另外循环语句存在语法错误,正确写法应为{% for model in modelData %}。


解决方案

方法1:在模型中添加属性(推荐)

直接在StatusData模型里定义属性,返回对应状态的显示文本,模板调用更直观:

class StatusData(models.Model):
    app = models.CharField(max_length=35)
    status = models.CharField(max_length=3)

    class Meta:
        managed = False

    def __str__(self):
        return self.status
    
    @property
    def status_display(self):
        status_map = {'SNY':'Sanity', 'DVL':'Develop', 'TST':'Testing'}
        # 找不到对应键时返回原状态值作为兜底
        return status_map.get(self.status, self.status)

模板中直接调用:

<html>
   {% for model in modelData %}
   <table>
     <tr>
        <td>{{ model.id }}</td>
        <td>{{ model.status_display }}</td>
     </tr>
   </table>
   {% endfor %}
</html>

方法2:自定义模板过滤器

如果不想修改模型,可自定义模板过滤器实现动态键取值:

  1. 在app目录下创建templatetags文件夹,新建custom_filters.py文件:
from django import template

register = template.Library()

@register.filter
def dict_key(d, key):
    """通过动态键从字典中取值"""
    return d.get(key, '')
  1. 在模板中加载过滤器并使用:
{% load custom_filters %}
<html>
   {% for model in modelData %}
   <table>
     <tr>
        <td>{{ model.id }}</td>
        <td>{{ choices|dict_key:model.status }}</td>
     </tr>
   </table>
   {% endfor %}
</html>

方法3:视图中预处理数据

在视图里提前为每个对象处理好状态对应值,再传递给模板:

all_choices = {'SNY':'Sanity', 'DVL':'Develop', 'TST':'Testing'}
model_data = StatusData.objects.order_by('-app')

# 为每个对象添加状态显示属性
for item in model_data:
    item.status_display = all_choices.get(item.status, item.status)

context = {
   "modelData": model_data,
}

模板中直接调用{{ model.status_display }}即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 00:07:34