如何在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:自定义模板过滤器
如果不想修改模型,可自定义模板过滤器实现动态键取值:
- 在app目录下创建
templatetags文件夹,新建custom_filters.py文件:
from django import template register = template.Library() @register.filter def dict_key(d, key): """通过动态键从字典中取值""" return d.get(key, '')
- 在模板中加载过滤器并使用:
{% 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
相关产品推荐
相关产品推荐

