html 显示Django每个帖子的赞计数器不工作

pu3pd22g  于 2022-12-16  发布在  Go
关注(0)|答案(2)|浏览(106)

我想在www.example.com文件中获取一个变量views.py,用于检索每个帖子的喜欢列表,因此,在HTML文件中,我将使用.count,这样我就可以获取列表中的条目数,并最终显示在DOM上。
我第一次在models.py上创建类。在那里,我有3个类:UserPostLike*User来自Django默认的User类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 %}

当然,在那之后,我创建了一个超级用户,并到admin向数据库添加了一些示例。然而,我在Like表中添加了一些新行,但没有显示每个帖子的总喜欢数。

w8biq8rn

w8biq8rn1#

您的 totalLikesSinglePost 只是最后一个帖子的赞记录列表。请在您的html文件中尝试以下操作:

<strong style="color: red">{{ post.post_like.count }}</strong>
brtdzjyr

brtdzjyr2#

因为totalLikesSinglePost在每一轮for循环中都会得到override。它是最后一个帖子的点赞总数。
您需要将此编号作为属性分配给帖子,例如

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'))

这将访问数据库只有一次,保存你很多时间.

相关问题