Почему я не могу отобразить данные, отфильтрованные для активного пользователя?
Я пытаюсь отобразить в своей таблице только данные для вошедшего в систему пользователя. Я могу отобразить все данные с помощью objects.all(), но когда я фильтрую данные по активному пользователю, это не работает. Я пробовал изменить контекст, чтобы ссылаться на набор запросов в целом, но получаю ошибку, говорящую, что я не могу выполнить get на кортеже.
Если у меня есть контекст как есть, я получаю ошибку 'Объект QuerySet не имеет атрибута 'user'
Models.py:
class HealthStats(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
date = models.DateField(auto_now=True)
weight = models.DecimalField(max_digits=5, decimal_places=2)
run_distance = models.IntegerField(default=5)
run_time = models.TimeField()
class Meta:
db_table = 'health_stats'
ordering = ['-date']
def __str__(self):
return f"{self.user} | {self.date}"
Views.py:
def health_history(request):
queryset = HealthStats.objects.filter(user=request.user).values()
print(queryset)
print(type(queryset))
context = {
"user": queryset.user_id,
"weight": queryset.weight,
"date": queryset.date,
"run_distance": queryset.run_distance,
"run_time": queryset.run_time,
}
return (request, 'health_hub_history.html', context)
health_hub_history.html:
{% extends 'base.html' %}
{% load static %}
{% block content %}
<div class="container-fluid">
<div class="row">
<div class="col-sm-12 text-center">
<h1>My Health History</h1>
</div>
</div>
</div>
<div class="container-fluid">
<div class="row justify-content-center">
<div class="col-auto text-center p-3">
<table class="table table-striped table-hover table-bordered">
<tr>
<td>User:</td>
<td>Weight (lbs):</td>
<td>Date:</td>
<td>Run Distance (km):</td>
<td>Run Time (HH:MM:SS):</td>
</tr>
{% for stat in queryset %}
<tr>
<td>{{ stat.user }}</td>
<td>{{ stat.weight }} </td>
<td>{{ stat.date }}</td>
<td>{{ stat.run_distance }}</td>
<td>{{ stat.run_time }}</td>
</tr>
{% endfor %}
</table>
</div>
</div>
</div>
{% endblock content %}
Не обращайте внимания на операторы печати - просто пытаюсь разобраться в проблеме, и удалю их, когда она будет решена. Также знайте, что .values() в конце объявления queryset, вероятно, неверно - оно там по тем же причинам.
Я хожу по кругу уже несколько часов, поэтому любая помощь будет оценена по достоинству!
HealthStats.objects.filter(user=request.user).values()
Приведенный выше код дает вам объект QuerySet, а не объект HealthStats
. Поскольку User
является ForeignKey
из HealthStats
, это означает, что каждый объект User
может иметь любое количество объектов HealthStats
, связанных с ним (он может иметь 0, 1, 2 или более статистик). Это означает, что функция health_history
должна давать вашему фронт-энду список объектов HealthStats
.
def health_history(request):
serialized_stats = []
# `filter` also returns a `QuerySet` object which is already iterable.
for stats in HealthStats.objects.filter(user=request.user):
serialized_stats.append({
"user": stats.user_id,
"weight": stats.weight,
"date": stats.date,
"run_distance": stats.run_distance,
"run_time": stats.run_time,
})
context = {
"stats": serialized_stats
}
return (request, 'health_hub_history.html', context)
Вероятно, вам также потребуется изменить логику html, чтобы правильно обработать это.
Это из-за вашего оператора возврата. Попробуйте следующее:
return (request, 'health_hub_history.html', {'queryset': queryset})