如何在我的模板中显示喜欢和我的帖子?

Posted

技术标签:

【中文标题】如何在我的模板中显示喜欢和我的帖子?【英文标题】:How do I show the likes & my post in my template? 【发布时间】:2021-03-01 13:15:04 【问题描述】:

我在models.py 文件中创建了两个模型。我还创建了一个视图,该视图呈现一个名为 index.html 的模板。我想在我的索引网页/模板中显示帖子,它的喜欢计数。但下面的代码不起作用。

models.py

from django.db import models
from django.contrib.auth.models import User

class Post(models.Model):
    title = models.CharField(max_length=42)
    author = models.ForiegnKey(User, on_delete=models.CASCADE, related_name='author_user')
    create_date = models.DateTimeField(auto_now_add=True)
    
    def __str__(self):
        return f'self.author.first_name self.author.last_name'

class Like(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='liked_post')
    user = models.Foreignkey(User, on_delete=models.CASCADE, related_name='post_liked_by')

    def __str__(self):
        return f'self.user.username@self.post.title'

views.py

from django.shortcuts import render
from .models import *

def index(request):
    posts = Post.objects.all()
    likes = Like.objects.all()
    context = 
       'posts': posts,
       'likes': likes,
    
    return render(request, 'index.html', context)

index.html

<html>
    <head>
        <title>
            Home
        </title>
    </head>
    <body>
        % for post in posts %
            <h1>
                 post.title 
            </h1>
            <p>
                Author:  post.author.first_name   post.author.last_name 
            </p>
            <p>
                Date Created:  post.create_date 
            </p>
            <p>
                <i class="fa fa-heart"></i>
                len(likes)
            </p>
        % endfor %
    </body>
</html>

提前谢谢你。

【问题讨论】:

【参考方案1】:

您可以使用 _set 访问反向关系,因此您可以在模板中执行类似操作,然后使用 css 随意设计它

% for post in posts %
    <h1>
         post.title 
    </h1> 
    <span> Number of likes: post.like_set.count()</span>

我建议你通过这个https://docs.djangoproject.com/en/3.1/topics/db/queries/

【讨论】:

【参考方案2】:

您将返回所有 Post 对象和所有 Like 对象,彼此独立:

    posts = Post.objects.all()
    likes = Like.objects.all()
    context = 
       'posts': posts,
       'likes': likes,
    

您需要在Post 对象上使用prefetch_related。在此处查看文档:

https://docs.djangoproject.com/en/3.1/ref/models/querysets/#prefetch-related https://docs.djangoproject.com/en/2.0/ref/models/querysets/#select-related

所以你会这样做:

posts = Post.objects.prefetch_related('like_set').all()

然后您可以在模板中引用post.like_set。无需单独查询Like,现在您可以按照您需要的方式“加入”信息,而不是在模板中连接两个不同的数据集时遇到问题。

但是在这种情况下,我认为这不是您真正想要做的。您正在尝试显示点赞数,对吧?

既然如此,我可能会在 post 查询中添加一个类似计数器的注释。如果适合您,请在此处查看相关文档:

https://docs.djangoproject.com/en/3.1/ref/models/querysets/#django.db.models.query.QuerySet.annotate

但是,如果您确实需要点赞信息(例如,您要显示点赞的人的列表),那么like_set 是您的最佳选择。

【讨论】:

以上是关于如何在我的模板中显示喜欢和我的帖子?的主要内容,如果未能解决你的问题,请参考以下文章

模板中的数据

如何在我的博客网站顶部显示最新帖子和评论?

如何使用 CBV 在我的所有 Django 模板中创建侧边栏?

如何在我的模板中显示数组值?

如何正确连接我的 servlet 和我的帖子表单? [复制]

如何让用户在 Django 中只喜欢/不喜欢帖子一次?