【问题标题】:Displaying "Like" and "Dislike" buttons if user has liked a post with Django如果用户喜欢 Django 的帖子,则显示“喜欢”和“不喜欢”按钮
【发布时间】:2020-11-04 04:31:16
【问题描述】:

感谢您抽出宝贵时间阅读本文。

我正在开发一个 CS50W 项目,我必须在其中显示一系列用户可以喜欢和不喜欢的帖子。

我可以成功显示喜欢的数量,但是一旦完成,我无法让“喜欢”按钮变为“不喜欢”。

以下是相关代码:

views.py

def index(request):
    return render(request, "network/index.html", {
        "posts": Post.objects.all().order_by('time'),
        "form": NewPost(),
        "likes": Like.objects.all(),
    })

...

def like(request, post_id):
    if request.method == "POST":
        #make sure user can't like the post more than once. 
        user = User.objects.get(username=request.user.username)
        #find whatever post is associated with like
        post = Post.objects.get(id=post_id)
        #access liked values: 

        if Like.objects.filter(user=user, post=post).exists():
            Like.alreadyLiked = True
            return HttpResponseRedirect(reverse('index'))
        else: 
            newLike = Like(user=user, post=post)
            newLike.alreadyLiked = True
            post.likes += 1
            post.save()
            newLike.save()
            return HttpResponseRedirect(reverse('index'))
    

然后是models.py

from django.contrib.auth.models import AbstractUser
from django.db import models
import datetime


class User(AbstractUser):
    pass

class Post(models.Model):
    text = models.CharField(max_length=127)
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="author")
    time = models.TimeField(auto_now=False, auto_now_add=True)
    likes = models.PositiveIntegerField(default=0)

    def __str__(self):
        if self.likes == 1:
            return f"{self.user} ({self.time}): {self.text} - {self.likes} Like"
        elif self.likes == 0:
            return f"{self.user} ({self.time}): {self.text} - No Likes"
        else:
            return f"{self.user} ({self.time}): {self.text} - {self.likes} Likes"

class Like(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="users")
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name="posts")
    alreadyLiked = models.BooleanField(default=False)

    def __str__(self):
        return f"{self.user} liked {self.post}"

最后是显示按钮的index.html。

{% extends "network/layout.html" %}

{% block body %}



<form action="/newPost" method="post" name="newPost">
{% csrf_token %}
{{ form.content }}
<input type="submit">
</form>


{% for post in posts %}


<div id="post{{post.id}}">{{ post }}

{% if likes.post == post and likes.user == user.username %}

    <form action="{% url 'dislike' post.id  %}" method="post" name="dislike" id="dislikeform">
        {% csrf_token %}
        <button type='submit' name='dislike' value="{{ post.id }}" class="btn btn-primary">Dislike</button>
    </form>

{% else %}    

    <form action="{% url 'like' post.id  %}" method="post" name="like" id="likeform">
        {% csrf_token %}
        <button type='submit' name='like' value="{{ post.id }}" class="btn btn-primary">Like</button>
    </form>

{% endif %}

{% if follows.following == True %}

    <form action="{% url 'unfollow' post.user  %}" method="post" name="follow">
        {% csrf_token %}
        <button type='submit' name='follow' value="{{ post.user }}" class="btn btn-primary">Follow</button>
    </form>

{% else %}

    <form action="{% url 'follow' post.user  %}" method="post" name="follow">
        {% csrf_token %}
        <button type='submit' name='follow' value="{{ post.user }}" class="btn btn-primary">Follow</button>
    </form>

{% endif %}

</div>

{% endfor %}

{% endblock %}

我的想法是,在喜欢和不喜欢的表单部分,django 模板应该确定登录用户是否已经喜欢该帖子,在这种情况下,它将显示一个不喜欢按钮而不是喜欢按钮。最重要的是这个部分:


{% if likes.post == post and likes.user == user.username %}

    <form action="{% url 'dislike' post.id  %}" method="post" name="dislike" id="dislikeform">
        {% csrf_token %}
        <button type='submit' name='dislike' value="{{ post.id }}" class="btn btn-primary">Dislike</button>
    </form>

{% else %}    

    <form action="{% url 'like' post.id  %}" method="post" name="like" id="likeform">
        {% csrf_token %}
        <button type='submit' name='like' value="{{ post.id }}" class="btn btn-primary">Like</button>
    </form>

{% endif %}

我对关注和取消关注按钮有类似的问题,但我觉得如果我可以实现第一个问题的解决方案,我也可以应用它。

【问题讨论】:

    标签: python django model cs50


    【解决方案1】:

    在重新考虑模型关系后想通了。

    我在我的 Post 模型中添加了一个新字段:

    class Post(models.Model):
        text = models.CharField(max_length=127)
        user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="author")
        time = models.TimeField(auto_now=False, auto_now_add=True)
        likes = models.PositiveIntegerField(default=0)
        user_likes = models.ManyToManyField(User)
    

    用户现在以多对多字段的形式与帖子相关,这允许我在这些模型之间创建关系。

    然后在views.py中:

    def like(request, post_id):
        if request.method == "POST":
            #make sure user can't like the post more than once. 
            user = User.objects.get(username=request.user.username)
            #find whatever post is associated with like
            post = Post.objects.get(id=post_id)
    
            newLike = Like(user=user, post=post)
            newLike.alreadyLiked = True
    
            post.likes += 1
            #adds user to Post 
            post.user_likes.add(user)
            post.save()
            newLike.save()
            return HttpResponseRedirect(reverse('index'))
    

    我对不喜欢做了同样的事情,并且会尝试同样的事情来关注和取消关注。

    最后,在 index.html 中:

    {% if user in post.user_likes.all %}
    
        <form action="{% url 'dislike' post.id  %}" method="post" name="dislike" id="dislikeform">
            {% csrf_token %}
            <button type='submit' name='dislike' value="{{ post.id }}" class="btn btn-primary">Dislike</button>
        </form>
    
    {% else %}    
    
        <form action="{% url 'like' post.id  %}" method="post" name="like" id="likeform">
            {% csrf_token %}
            <button type='submit' name='like' value="{{ post.id }}" class="btn btn-primary">Like</button>
        </form>
    
    {% endif %}
    

    现在它运行良好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-04
      • 2017-09-06
      • 2020-09-03
      • 2012-09-20
      • 1970-01-01
      • 2014-09-21
      • 2019-07-03
      • 1970-01-01
      相关资源
      最近更新 更多