Отображение счетчика лайков на пост с помощью Django не работает
Я хочу получить переменную в файле views.py, которая извлекает список лайков для каждого поста. Затем в HTML-файле я использую .count
, чтобы получить количество элементов в списке и, наконец, отобразить их в DOM.
Я впервые создал классы на models.py
. Там у меня есть 3 класса: User, Post и Like. User взят из класса User по умолчанию из Django. Post - это класс, который получает информацию о посте, такую как автор, описание и метка времени. А на классе Like я получаю пользователя и пост.
from django.contrib.auth.models import AbstractUser
from django.db import models
class User(AbstractUser):
pass
class Post(models.Model):
author = models.ForeignKey("User", on_delete=models.CASCADE, related_name="user")
description = models.CharField(max_length=1000)
timestamp = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f"{self.id}: {self.author}"
class Like (models.Model):
user = models.ForeignKey("User", on_delete=models.CASCADE, default='', related_name="user_like")
post = models.ForeignKey("Post", on_delete=models.CASCADE, default='', related_name="post_like")
def __str__(self):
return f"{self.id}:{self.user} likes {self.post}"
Во-вторых, я сделал функцию на views.py
под названием "index". Там я получаю весь список постов (на переменной posts
), затем я попытался создать переменную (totalLikesSinglePost
), которая должна получить список лайков для каждого поста.
def index(request):
posts = Post.objects.all().order_by("id").reverse()
# Pagination Feature (OMIT THIS, IF YOU WANT)
p = Paginator(posts, 10)
pageNumber = request.GET.get('page')
postsPage = p.get_page(pageNumber)
# Total likes of each post. DOESN'T WORK ⏬
for postSingle in posts:
totalLikesSinglePost = Like.objects.all().filter(post = postSingle)
return render(request, "network/index.html", {
"posts": posts,
"postsPage": postsPage,
"totalLikesPost": totalLikesSinglePost
})
Наконец, в HTML-файле я получаю каждый пост с информацией о нем и количеством лайков. Однако на выходе отображается только число 0
{% for post in postsPage %}
<div class="row">
<div class="col">
<div class="card h-100" id="post-grid">
<div class="card-body">
<h5>{{ post.author }}</h5>
<div> | {{ post.timestamp }}</div>
<p>{{ post.description }}</p>
<div class="card-buttonsContainer">
<strong style="color: red">{{ totalLikesPost.count }}</strong> <!--0 IS DISPLAYED-->
</div>
</div>
</div>
</div>
</div>
{% endfor %}
И конечно, после этого я создал суперпользователя и зашел в админку, чтобы добавить несколько примеров в базу данных. Однако, я добавил несколько новых строк в таблицу Like, но она не отображает общее количество лайков для каждого поста.
Ваш totalLikesSinglePost - это просто список записей Like последнего поста. Попробуйте сделать следующее в вашем html-файле:
<strong style="color: red">{{ post.post_like.count }}</strong>
Потому что totalLikesSinglePost
получают переопределение в каждом раунде цикла for. Это общее количество лайков последнего сообщения.
Вам нужно присвоить этот номер посту как атрибут, например
for post in posts:
post.num_likes = Like.objects.all().filter(post=post).count()
А затем в вашем шаблоне
{% for post in posts %}
{# ... #}
{{ post.num_likes }}
{% endfor %}
Однако, я настоятельно рекомендую использовать .annotate
from django.db.models import Count
posts = Post.objects.all().order_by('-id')\
.annotate(num_likes=Count('like'))
Это позволит получить доступ к базе данных только один раз и сэкономит вам много времени.