感谢您花时间阅读本文。
我正在开发一个 CS50W 项目,其中我必须显示一系列用户可以喜欢和不喜欢的帖子。
我可以成功显示喜欢的数量,但完成后我无法将“喜欢”按钮更改为“不喜欢”。
相关代码如下:
View .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 %}
我对“关注”和“取消关注”按钮也有类似的问题,但我觉得如果我可以实现第一个问题的解决方案,我也可以应用它。
最佳答案
重新思考模型关系后弄清楚了。
我向我的 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)
用户现在与作为 ManytoManyField 的帖子相关,这允许我在这些模型之间创建关系。
然后在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 %}
现在一切正常。
关于python - 如果用户喜欢 Django 的帖子,则显示 "Like"和 "Dislike"按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62901935/