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
相关产品推荐
相关产品推荐

