如何在Django模板if语句标签中使用查询结果判断外键字段属性
问题核心原因
ETF.asset_class是外键关联的Asset_class模型实例,并非字符串,直接和字符串做等值比较永远返回False,所以判断逻辑不生效。
可行解决方案
方案1:模板直接比对外键属性(最快修复)
直接修改模板判断逻辑,比对asset_class的name字段即可,注意如果asset_class允许为空,要先判断对象是否存在避免报错。
修改后的category.html代码:
{% for ETF in ETFs %} <td>{{ ETF.ticker }}</td> <td>{{ ETF.full_name }} {% if ETF.asset_class and ETF.asset_class.name == "Inverse" %} <span class="alert-warning"> Inverse </span> {% endif %} </td> {% endfor %}
方案2:模型层新增判断属性(更易维护)
把判断逻辑封装到模型层,避免模板硬编码字符串,后续修改判断规则时不需要调整模板代码。
修改models.py中的ETF类:
class ETF(models.Model): ticker = models.CharField(max_length=6, blank=False, db_index=True, unique=True, primary_key=True) asset_class = models.ForeignKey(Asset_class, on_delete=models.PROTECT, blank=True, null=True) @property def is_inverse_asset(self): return self.asset_class and self.asset_class.name == "Inverse"
模板中直接调用属性即可:
{% if ETF.is_inverse_asset %} <span class="alert-warning"> Inverse </span> {% endif %}
方案3:关联样式表动态渲染(扩展性最强)
你已经定义了Asset_class_style样式表,可以将Asset_class与样式表关联,后续新增资产类型不需要修改模板,只需要在数据库配置对应样式即可。
首先给Asset_class模型新增样式关联外键:
class Asset_class(models.Model): # 保留原有字段 style = models.ForeignKey(Asset_class_style, on_delete=models.PROTECT, blank=True) # 保留原有方法
模板中无需写硬编码判断,直接动态加载样式:
<td>{{ ETF.full_name }} {% if ETF.asset_class %} <span class="{{ ETF.asset_class.style.slug }}"> {{ ETF.asset_class.name }} </span> {% endif %} </td>
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

