Django - Булево поле возвращает false в шаблоне и true в базе данных
Да, проблема у меня такая, как написано в заголовке. В базе данных поле boolean может быть установлено как true, но в шаблоне html оно отображается как false.
models.py
class TrainingGoal(models.Model):
forgeid = models.ForeignKey(ForgeUser, on_delete=models.CASCADE, default=None)
strength = models.BooleanField(default=False)
cardio = models.BooleanField(default=False)
yoga = models.BooleanField(default=False)
def __str__(self):
return self.forgeid.forgepass
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)
training_goal_query = TrainingGoal.objects.filter(forgeid=forge_user_query)
return render(request, 'profileapp/profile.html', {'forge_profile': forge_user_query, 'training_goals': training_goal_query})
abridged profile.html
{% if training_goals %}
<div class="goal-container">
<span class={{training_goals.strength | yesno:"training-true,training-false"}}>STRENGTH</span>
<span class={{training_goals.cardio | yesno:"training-true,training-false"}}>CARDIO</span>
<span class={{training_goals.yoga | yesno:"training-true,training-false"}}>YOGA</span>
</div>
{% endif %}
Значение класса тега span всегда отображается как training-false
, и даже расширение его в оператор if показывает, что возвращаемое значение равно false. Не уверен, что я здесь упускаю.
Проблема в том, что в наборе запросов вы используете фильтр, который возвращает более одного объекта. Поэтому вы не можете получить доступ к значениям, используя .<field_name>
training_goal_query = TrainingGoal.objects.filter(forgeid=forge_user_query)
Добавьте цикл for и он будет работать нормально
{% if training_goals %}
{% for goals in training_goals %}
<div class="goal-container">
<span class={{goals.strength | yesno:"training-true,training-false"}}>STRENGTH</span>
<span class={{goals.cardio | yesno:"training-true,training-false"}}>CARDIO</span>
<span class={{goals.yoga | yesno:"training-true,training-false"}}>YOGA</span>
</div>
{% endfor %}
{% endif %}