根据用户是否喜欢帖子更改按钮

2024-09-24 22:22:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在创建一个社交媒体网站,用户可以喜欢彼此的帖子。到目前为止,我已经实现了其中的大部分,但是我缺少了一个重要的部分。你知道吗

这是改变按钮中的文本,这取决于用户是否喜欢帖子。你知道吗

“tuser”变量在Post类中名为“likes”的多对多字段中查找用户。取决于它是否存在。你知道吗

我将一个变量传递给我的“home”模板,如果它存在,则在按钮中显示特定文本。你知道吗

你知道吗型号.py地址:

class Post(models.Model):
    file = models.ImageField(upload_to='images/')
    summary = models.TextField(max_length=600)
    pub_date = models.DateTimeField(auto_now=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    likes = models.ManyToManyField(User, through='Like', related_name='likes')

    def __str__(self):
        return self.user.username

    def pub_date_pretty(self):
        return self.pub_date.strftime('%b %e %Y')

    def summary_pretty(self):
        return self.summary[:50]

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

class Like(models.Model):
    status = models.BooleanField()
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)

你知道吗视图.py你知道吗

def likepost(request, post_id):
    if request.method == 'POST':
        post = get_object_or_404(Post, pk=post_id)
        user = request.user
        if post.likes.filter(id=user.id).exists():
            tuser = post.likes.filter(id=user.id)
            post.likes.remove(user)
            if tuser:
                return redirect('home', {'tuser': tuser})
            else:
                return redirect('home')
        else:
            like = Like()
            like.post = post
            like.user = user
            like.status = False
            like.save()
            post.likes.add(user)
            return redirect('home')

模板代码:

{% if tuser %}
         <a href="javascript:{document.getElementById('likepost{{ post.id }}').submit()}"><button class="btn btn-primary btn-lg btn-block"><span class="oi oi-caret-top"></span> Unlike {{ post.total_likes }} </button></a>
{% else %}
         <a href="javascript:{document.getElementById('likepost{{ post.id }}').submit()}"><button class="btn btn-primary btn-lg btn-block"><span class="oi oi-caret-top"></span> Like {{ post.total_likes }} </button></a>
{% endif %}
<form id="likepost{{ post.id }}" method="POST" action="{% url 'likepost' post.id %}">
  {% csrf_token%}
  <input type="hidden">
</form>

呈现主页的代码:

@login_required(login_url="/login")
def home(request):
    posts = Post.objects.all()
    return render(request, 'posts/home.html', {'posts': posts})

Tags: selfidhomereturnmodelsrequestdefpost