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

Django模板如何根据字段数值替换变量显示内容

实现方案说明

这个需求完全可以实现,直接用Django内置模板标签、视图层预处理两种方式都能做,根据你的场景选就行。


方案1:纯模板标签实现(无需改视图代码)

不用动现有后端查询逻辑,直接改模板遍历部分的代码,用内置的if标签做值判断替换就行,改完直接生效:

{% for b in books %}
<tr>
<td>
    {% if b.books_id == 1 %}
        completed
    {% elif b.books_id == 2 %}
        no
    {% else %}
        {# 其他id如果需要兜底显示原值就留这行,不需要可以删掉 #}
        {{ b.books_id }}
    {% endif %}
</td>
</tr>
{% endfor %}

这种方式最省事,适合映射规则固定、逻辑简单的场景,不用动后端代码。


方案2:视图层预处理实现

如果后续状态映射可能频繁调整,或者不想在模板里写太多判断逻辑,可以在后端查完数据先做一轮值转换,再传给模板,维护起来更方便。
顺带提一句,你现在视图里写的books=books.objects.all()有变量名冲突的问题——查询结果集和模型类同名了,赋值后会覆盖原模型类,后续调用模型相关方法会报错,建议调整变量名,预处理参考代码:

# 注意模型类名一般约定首字母大写,这里按你的实际模型名调整即可
book_queryset = Books.objects.all()
# 定义id和展示文本的映射关系,后续加新状态直接改这个字典就行
status_map = {
    1: "completed",
    2: "no"
}
processed_books = []
for book in book_queryset:
    processed_books.append({
        "books_id": book.books_id,
        "status_text": status_map.get(book.books_id, book.books_id),
        # 其他需要在模板展示的字段也可以一并放到这里
    })
# 把处理好的processed_books传给模板

对应模板里直接取预处理好的展示字段就行,不需要再写判断:

{% for b in processed_books %}
<tr>
<td>{{ b.status_text }}</td>
</tr>
{% endfor %}

如果这个状态映射是模型的固定属性,更推荐直接在Books模型类里写一个专门返回展示文本的方法,模板里直接调用{{b.get_status_text}}就行,逻辑更内聚。


内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 23:09:58