Отображение счетчика лайков на пост с помощью 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'))

Это позволит получить доступ к базе данных только один раз и сэкономит вам много времени.

Вернуться на верх