【问题标题】: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>

提前谢谢你。

【问题讨论】:

    标签: django


    【解决方案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。在此处查看文档:

      所以你会这样做:

      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 是您的最佳选择。

      【讨论】:

        猜你喜欢
        • 2017-05-08
        • 2020-11-04
        • 1970-01-01
        • 2020-09-03
        • 1970-01-01
        • 2020-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多