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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 00:22:27