Как подсчитывать и фильтровать объекты в шаблоне Django?

У меня есть две модели: в одной пользователь создает пост, а в другой собираются лайки этих постов. Теперь я хочу, чтобы количество этих лайков отображалось в посте. Есть ли способ отобразить все посты с количеством лайков на одном шаблоне?

template.html:

<div class="col-sm-4 mx-auto ">
        <ul class="list-group">
    {%for post in posts %}
    
      <a id="like_{{post.id}}" href="" class="like-link text-muted">
        +{% for every_like in likes_obj%}{%if every_like.liked_what == post%}{{every_like.count}}{%endif%}{%endfor%}

## At this point I would like to see the number of likes for each post it is assigned to, but unfortunately {{every_like.count}} returns
 nothing.

      </a>
    
    {% endfor %}
        </ul>
    </div>

views.py:

def index(request):
    list = Post.objects.all().order_by('-date')

    paginator = Paginator(list, 10)

    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)

    return render(request, "network/index.html", {
        "post_form": PostForm(),
        "posts": page_obj,
        "likes_obj": Like.objects.all()
    })

models.py:

class Post(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    subject = models.CharField(max_length=200, blank=False)
    content = models.TextField(blank=False)

class Like(models.Model):
    author_of_like = models.ForeignKey(User, on_delete=models.CASCADE)
    liked_what = models.ForeignKey(Post, on_delete=models.CASCADE)

Вы можете .annotate(…) [Django-doc] с:

from django.db.models import Sum

def index(request):
    posts = Post.objects.annotate(
        number_of_likes=Count('like')
    ).order_by('-date')

    paginator = Paginator(posts, 10)

    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)

    return render(request, 'network/index.html', {
        'post_form': PostForm(),
        'posts': page_obj
    })

Объекты Post, возникающие из этого QuerySet, будут иметь дополнительный атрибут .number_of_likes, так что вы отобразите это с помощью:

{%for post in posts.qs %}
    <a id="like_{{post.id}}" href="" class="like-link text-muted">+{{ post.number_of_likes }}</a>
{% endfor %}

Note: It is normally better to make use of the settings.AUTH_USER_MODEL [Django-doc] to refer to the user model, than to use the User model [Django-doc] directly. For more information you can see the referencing the User model section of the documentation.


Note: Please do not name a variable list, it overrides the reference to the list builtin function [Python-doc]. Use for example posts.


Примечание: Раздел 9 протокола HTTP. определяет, что запросы типа GET и HEAD должны не иметь побочных эффектов, поэтому вы не должны не должны изменять сущности с помощью простой ссылки (с тегами <a href="…">…</a>). Обычно для этого используются запросы POST, PUT, PATCH и DELETE. В этом случае вы делаете небольшой <form>, который запускает POST-запрос, или используете некоторые вызовы AJAX.

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