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

Django模板中如何根据枚举值控制元素的显示与隐藏?

解决Django模板中枚举值判断失效的问题

方法一:将枚举类传入模板上下文

在视图函数里把DeviceState枚举类添加到模板上下文,就能在模板中直接引用枚举成员做判断:

  1. 视图函数中补充上下文:
from django.shortcuts import render
from .your_module import DeviceState, Light

def your_view(request):
    lights = [Light(1, "客厅灯", DeviceState.ON), Light(2, "卧室灯", DeviceState.OFF)]
    # 将枚举类传入模板
    return render(request, 'your_template.html', {'lights': lights, 'DeviceState': DeviceState})
  1. 模板中直接使用枚举成员判断:
{% for light in lights %}
    <tr>
        <td>{{ light.name }}</td>
        <td>{{ light.state }}</td>
        <td>
            {% if light.state == DeviceState.ON %}
                <button type="button" class="btn btn-dark">Lights off</button>
            {% endif %}
            {% if light.state == DeviceState.OFF %}
                <button type="button" class="btn btn-success">Lights on</button>
            {% endif %}
        </td>
    </tr>
{% endfor %}

方法二:直接判断枚举的value或name属性

light.state是枚举实例对象,你可以访问它的value(对应枚举定义的数值)或name(对应枚举的名称字符串)属性来做判断:

判断数值value:

{% if light.state.value == 3 %}
    <button type="button" class="btn btn-dark">Lights off</button>
{% endif %}
{% if light.state.value == 4 %}
    <button type="button" class="btn btn-success">Lights on</button>
{% endif %}

判断名称name:

{% if light.state.name == "ON" %}
    <button type="button" class="btn btn-dark">Lights off</button>
{% endif %}
{% if light.state.name == "OFF" %}
    <button type="button" class="btn btn-success">Lights on</button>
{% endif %}

方法三:在Light类中添加辅助方法

给Light类添加判断状态的方法,让模板调用更直观:

class Light:
    def __init__(self, id, name, state: DeviceState = DeviceState.UNKNOWN):
        self.id = id
        self.name = name
        self.state: DeviceState = state

    def is_on(self):
        return self.state == DeviceState.ON

    def is_off(self):
        return self.state == DeviceState.OFF

模板中调用方法判断:

{% for light in lights %}
    <tr>
        <td>{{ light.name }}</td>
        <td>{{ light.state }}</td>
        <td>
            {% if light.is_on %}
                <button type="button" class="btn btn-dark">Lights off</button>
            {% endif %}
            {% if light.is_off %}
                <button type="button" class="btn btn-success">Lights on</button>
            {% endif %}
        </td>
    </tr>
{% endfor %}

原写法失效的原因

你之前尝试的== 3、== "OFF"等写法无效,是因为light.state是DeviceState枚举的实例对象,不是单纯的数字或字符串。直接和数字、字符串比较时,类型不匹配,判断结果永远为False。

内容的提问来源于stack exchange,提问作者Sven van den Boogaart

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 19:45:06