Django模板中如何根据枚举值控制元素的显示与隐藏?
解决Django模板中枚举值判断失效的问题
方法一:将枚举类传入模板上下文
在视图函数里把DeviceState枚举类添加到模板上下文,就能在模板中直接引用枚举成员做判断:
- 视图函数中补充上下文:
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})
- 模板中直接使用枚举成员判断:
{% 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
相关产品推荐
相关产品推荐

