Django模板{% if %}块标签不显示 如何将类型编号转为自定义展示文字
问题根源
你的Post模型中p_type是关联PostType表的外键字段,模板里调用p.p_type得到的是PostType实例对象,不是你预期的字符串类型的编号值,和'1'/'2'对比永远不成立,所以判断块内容不会输出。
解决方案
方案1:直接修改模板判断逻辑(改动最小,适配现有结构)
把模板里的判断条件修改为对比PostType实例的p_type字段即可:
{% for p in postlist %} <tr> <td> {% if p.p_type.p_type == '1' %} cloud {% elif p.p_type.p_type == '2' %} wind {% endif %} </td> </tr> {% endfor %}
方案2:用Django内置choices特性简化代码(推荐,固定类型场景下更优雅)
如果你的帖子类型是固定的几个枚举值,不需要动态增删,可以直接去掉PostType表,给Post的p_type字段配置choices:
# models.py的Post模型修改 class Post(models.Model): # 其他字段省略 TYPE_CHOICES = [ ('1', 'cloud'), ('2', 'wind'), ] p_type = models.CharField(max_length=10, choices=TYPE_CHOICES)
模板里不需要写任何if判断,直接调用内置的get_xxx_display方法就能输出对应自定义名称:
{{ p.get_p_type_display }}
方案3:保留PostType表的优化方案
如果需要动态管理帖子类型,建议在PostType模型里新增专门的显示名字段,避免硬编码判断:
class PostType(models.Model): p_type = models.CharField(max_length=200, db_index=True) # 新增显示名,存cloud、wind这类要展示的内容 display_name = models.CharField(max_length=200) def __str__(self): return self.p_type
模板直接输出即可,不需要判断:
{{ p.p_type.display_name }}
内容的提问来源于stack exchange,提问作者stand0
相关产品推荐
相关产品推荐

