Как подсчитывать и фильтровать объекты в шаблоне 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 theUser
model [Django-doc] directly. For more information you can see the referencing theUser
model section of the documentation.
Note: Please do not name a variable
list
, it overrides the reference to thelist
builtin function [Python-doc]. Use for exampleposts
.
Примечание: Раздел 9 протокола HTTP. определяет, что запросы типа GET и HEAD должны не иметь побочных эффектов, поэтому вы не должны не должны изменять сущности с помощью простой ссылки (с тегами
<a href="…">…</a>
). Обычно для этого используются запросы POST, PUT, PATCH и DELETE. В этом случае вы делаете небольшой<form>
, который запускает POST-запрос, или используете некоторые вызовы AJAX.