如何在Django模板中调用模型choices字段并去重显示?
解决Django模板中显示Choices唯一选项的问题
嘿,我来帮你搞定这个需求!先纠正下你代码里的两个小笔误:models里的choices=TYPE应该是choices=CAT,还有views里返回的上下文应该是{'my_model': my_model}而不是{'post': post},不然模板里会找不到变量哦。
根据你“完全不关注帖子本身,只想显示Choices里的唯一选项”的需求,给你两种实用方案:
方案一:直接调用模型定义的Choices常量(最推荐)
既然你根本不需要帖子数据,那完全没必要从数据库查所有帖子再去重,直接把模型里定义的CAT Choices传到模板就好:
第一步:修改views.py
from .models import Model # 导入你的模型类 def cat(request): # 直接把模型里的CAT Choices取出来传到模板 cat_options = Model.CAT return render(request, 'template.html', {'cat_options': cat_options})
第二步:修改template.html
{% for value, label in cat_options %} {{ label }} <!-- 这里显示的是Choices里的标签,比如你定义的"1"、"2";如果要显示存到数据库里的value就用{{ value }} --> {% endfor %}
这样不管数据库里有没有对应帖子,都会显示你在模型里定义的所有Choices选项,完美匹配你的需求。
方案二:只显示数据库中实际使用过的唯一选项
如果你只想展示数据库里已经有帖子用到的cat选项,那可以用Django的distinct()查询来去重:
第一步:修改views.py
from .models import Model def cat(request): # 提取数据库中cat字段的唯一值,flat=True让结果是一个列表而不是元组 unique_cat_values = Model.objects.values_list('cat', flat=True).distinct() # 把这些值和Choices里的标签对应起来 cat_choices_dict = dict(Model.CAT) used_cat_options = [(val, cat_choices_dict[val]) for val in unique_cat_values if val in cat_choices_dict] return render(request, 'template.html', {'used_cat_options': used_cat_options})
第二步:修改template.html
{% for value, label in used_cat_options %} {{ label }} {% endfor %}
另外提一句,不推荐在模板里做去重逻辑(比如用自定义标签存已见过的值),因为Django的设计理念是让视图层处理逻辑,模板只负责展示,这样代码更清晰易维护。
内容的提问来源于stack exchange,提问作者Belloz
相关产品推荐
相关产品推荐

