我在我的网站上添加了一个类似的功能,用户可以在其中互相喜欢其他帖子。
我已经成功地做到了这一点,但是有一个问题。这是检查用户是否已经喜欢该帖子,这必须在我的 HOME 视图中专门执行。
这样我就可以呈现我的主页。为了遇到这个问题,我在检索帖子时对我的帖子执行了 .annotate() ,并查看用户是否喜欢帖子。
然后我将其传递到我的主页模板并检查用户是否存在于 posts likes 属性中。
这是相关的代码。
模型.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 home(request):
posts = Post.objects.all()
liked_or_not = Post.objects.annotate(likes__user=request.user)
return render(request, 'posts/home.html', {'posts': posts, 'liked_or_not': liked_or_not})
主页.html:
{% if liked_or_not == True %}
<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>
原文由 djangoninja 发布,翻译遵循 CC BY-SA 4.0 许可协议
我不太明白你想做什么。如果你想检查用户是否至少喜欢一个帖子,你可以这样做:
如果你想检查用户是否喜欢特定的帖子,你可以像这样点它:
annotate 有不同的目的。它使用提供的查询表达式列表注释 QuerySet 中的每个对象。表达式可以是一个简单的值、对模型(或任何相关模型)上字段的引用,或者是对与模型中的对象相关的对象计算的聚合表达式(平均值、总和等)查询集。在这里阅读更多 https://docs.djangoproject.com/en/2.2/ref/models/querysets/#annotate