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

Django BooleanField数据库值为true但模板渲染返回false问题

问题根因

视图层查询使用filter()方法返回的是QuerySet集合对象,并非单个TrainingGoal模型实例。即使查询结果仅匹配1条记录,该对象依然是集合类型,不具备模型实例的.strength、.cardio、.yoga属性,模板访问不存在的属性时会返回假值,因此所有布尔判断永远走false分支。

修复方案

根据实际业务关联逻辑二选一调整即可:

场景1:单用户仅对应1条训练目标记录(匹配当前模型设计逻辑)

将视图层的查询调整为取单条实例,推荐用first()避免记录不存在时抛出500错误:

# views.py 对应代码修改
def profileView(request):
    if not ForgeUser.objects.filter(forgeid=request.user).exists():
        return redirect('profileapp:create')

    forge_user_query = ForgeUser.objects.get(forgeid=request.user)
    # 取匹配的第一条记录,无匹配时返回None,适配模板的if判断
    training_goal = TrainingGoal.objects.filter(forgeid=forge_user_query).first()

    return render(request, 'profileapp/profile.html', {
        'forge_profile': forge_user_query, 
        'training_goal': training_goal
    })

对应模板同步调整变量名,同时给class属性补上标准引号:

{% if training_goal %}
  <div class="goal-container">
    <span class="{{training_goal.strength | yesno:"training-true,training-false"}}">STRENGTH</span>
    <span class="{{training_goal.cardio | yesno:"training-true,training-false"}}">CARDIO</span>
    <span class="{{training_goal.yoga | yesno:"training-true,training-false"}}">YOGA</span>
  </div>
{% endif %}

场景2:单用户可能对应多条训练目标记录

视图层代码无需修改,模板层增加循环遍历QuerySet,拿到单个实例后再访问属性:

{% if training_goals %}
  <div class="goal-container">
    {% for goal in training_goals %}
    <span class="{{goal.strength | yesno:"training-true,training-false"}}">STRENGTH</span>
    <span class="{{goal.cardio | yesno:"training-true,training-false"}}">CARDIO</span>
    <span class="{{goal.yoga | yesno:"training-true,training-false"}}">YOGA</span>
    {% endfor %}
  </div>
{% endif %}

小提示:Django模板中访问QuerySet的模型字段不会自动取第一条记录的属性,必须先拿到单个模型实例,才能访问对应字段值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 17:45:38