Django模板无法调用get_damage_display显示Choice标签求助
解决Django模板无法显示Choice标签的问题
问题根源
使用values()查询返回的是字典对象,而非模型实例。get_xxx_display()是Django模型实例提供的内置方法,字典没有这个方法,因此无法通过{{ item.get_damage_display }}获取选项标签。
解决方案
方案1:改用模型实例查询(推荐)
放弃values(),直接查询模型实例集合,这样每个item都是Malpractice_Detail的实例,可直接调用get_damage_display()方法:
视图代码示例
from django.shortcuts import render from .models import Malpractice_Detail def your_view(request): # 直接查询模型实例,而非values() malpractice_details = Malpractice_Detail.objects.all() # 可添加filter条件 return render(request, 'your_template.html', {'malpractice_details': malpractice_details})
模板代码示例
{% for item in malpractice_details %} <p>值:{{ item.damage }},标签:{{ item.get_damage_display }}</p> {% endfor %}
方案2:若必须使用values(),手动注入标签值
如果因为性能或数据量原因必须用values(),可以在视图中手动将选项标签映射到查询结果:
步骤1:定义选项映射字典
假设你的Damage_Choice定义如下:
Damage_Choice = [ (1, '轻伤'), (2, '重伤'), (3, '死亡'), ]
先创建映射字典:
damage_choice_map = dict(Damage_Choice)
步骤2:处理查询结果
def your_view(request): # 使用values()查询需要的字段 queryset = Malpractice_Detail.objects.values('damage', 'other_field') # 遍历字典,添加标签字段 result_list = [] for item in queryset: item['damage_label'] = damage_choice_map.get(item['damage'], '未知') result_list.append(item) return render(request, 'your_template.html', {'items': result_list})
模板代码示例
{% for item in items %} <p>值:{{ item.damage }},标签:{{ item.damage_label }}</p> {% endfor %}
方案3:自定义模板过滤器
创建一个模板过滤器,通过选项值直接获取对应标签,无需修改视图逻辑:
步骤1:创建自定义过滤器
在你的app目录下创建templatetags文件夹(需包含__init__.py),新建custom_filters.py:
from django import template register = template.Library() @register.filter def get_choice_label(value, choices): """根据选项值获取对应的标签""" for choice_val, choice_label in choices: if choice_val == value: return choice_label # 若未匹配到,返回原始值或默认文本 return str(value)
步骤2:在模板中使用过滤器
首先加载过滤器,然后传入选项列表和值:
{% load custom_filters %} {% for item in items %} <p>值:{{ item.damage }},标签:{{ item.damage|get_choice_label:Damage_Choice }}</p> {% endfor %}
注意:需要将Damage_Choice传递到模板上下文(比如在视图里context['Damage_Choice'] = Damage_Choice)。
内容的提问来源于stack exchange,提问作者Davood Aghavil Jahromy
相关产品推荐
相关产品推荐

