如何计算用户在Django中所有帖子的点赞总数?

bz4sfanl  于 2023-06-07  发布在  Go
关注(0)|答案(1)|浏览(170)

我正在做一个Django项目,我试图根据一个用户的帖子来计算他们的总点赞数(即如果一个用户有10个点赞,另一个有5个,总点赞数必须显示15)。我试过各种方法,但都没能成功。
这里是我的models.py:

class User(AbstractUser):
    username = models.CharField(...)
    first_name = models.CharField(...)
    last_name = models.CharField(...)
    email = models.EmailField(...)
    bio = models.CharField(...)
    ...

class Post(models.Model):
    author = models.ForeignKey(User, null=True, on_delete=models.SET_NULL)
    text = models.CharField(max_length=280)
    created_at = models.DateTimeField(auto_now_add=True)
    likes = models.ManyToManyField(User, related_name="user_post")

    def total_likes(self):
        return self.likes.count()

    class Meta:
        ordering = ["created_at"]

在这里,我试图在这个html文件(用户配置文件)中显示来自特定用户的所有帖子的喜欢总数:

...
    <p>Total likes: {{ post.likes.all.count }} </p>
...

views.py

@login_required
def show_user(request, user_id):
    try:
        user = User.objects.get(id=user_id)
        posts = Post.objects.filter(author=user)
    except ObjectDoesNotExist:
        return redirect('user_list')
    else:
        return render(request, 'show_user.html', {'user': user , 'posts' : posts, 'request_user': request.user})

以下是我迄今为止尝试过的:
1.最初,我尝试使用{{ post.likes.all.count }}模板标签来显示每个帖子的点赞总数。然而,这并不起作用,因为它没有在屏幕上返回任何值。
1.接下来,我尝试在一个循环中使用{% add %}模板标记来迭代所有帖子并累积喜欢计数。但是,这导致TemplateSyntaxError。
我不知道解决这个问题的最好方法是什么。我将非常感谢任何关于如何计算和显示Django中所有帖子中用户的点赞总数的指导或建议。

zf2sa74q

zf2sa74q1#

您可以通过以下方式确定作者的点赞总数:

from django.db.models import Count

@login_required
def show_user(request, user_id):
    user = get_object_or_404(
        User.objects.annotate(total_likes=Count('post__likes')), pk=user_id
    )
    posts = Post.objects.filter(author=user)
    return render(
        request,
        'show_user.html',
        {'user': user, 'posts': posts, 'request_user': request.user},
    )

在模板中,您可以通过以下方式呈现用户的总喜欢:

{{ user.total_likes }}

您还可以通过以下方式提高 * 每篇文章 * 的点赞数:
from django.db.models import Count

@login_required
def show_user(request, user_id):
    user = get_object_or_404(
        User.objects.annotate(total_likes=Count('post__likes')), pk=user_id
    )
    posts = Post.objects.annotate(num_likes=Count('likes')).filter(author=user)
    return render(
        request,
        'show_user.html',
        {'user': user, 'posts': posts, 'request_user': request.user},
    )

在模板中,您可以使用以下命令渲染:

{% for post in posts %}
  {{ post }} (likes: {{ post.num_likes }})
{% endfor %}

注意:通常使用**get_object_or_404(…)[Django-doc]比直接使用.get(…)[Django-doc]更好。如果对象不存在,例如因为用户自己更改了URL,则get_object_or_404(…)将导致返回 HTTP 404 Not Found 响应,而使用.get(…)将导致 HTTP 500 Server Error
注意:通常使用
settings.AUTH_USER_MODEL[Django-doc]引用用户模型比直接使用User**模型[Django-doc]更好。有关详细信息,请参阅文档的 referencing the User model 部分。

相关问题