我只是在学习Django,所以任何指导都会非常感激。我正在创建一个应用程序,经过身份验证的用户可以喜欢其他帖子。在其中一个页面上,我想渲染并显示最喜欢的帖子。请看下面的代码:
models.py:
class Enter(models.Model):
title = models.CharField(
max_length=200, unique=True, null=False, blank=False)
slug = models.SlugField(
max_length=200, unique=True, null=False, blank=False)
competitor = models.ForeignKey(
User, on_delete=models.CASCADE, related_name='post_enter')
updated_on = models.DateTimeField(auto_now=True)
content = models.TextField()
featured_image = CloudinaryField('image', null=False, blank=False)
created_on = models.DateTimeField(auto_now_add=True)
status = models.IntegerField(choices=STATUS, default=0)
likes = models.ManyToManyField(User, related_name='post_likes', blank=True)
class Meta:
ordering = ['-created_on']
def save(self, *args, **kwargs):
self.slug = slugify(self.title)
super(Enter, self).save(*args, **kwargs)
def __str__(self):
return self.title
def number_of_likes(self):
return self.likes.count()
views.py:
class CurrentOrderList(generic.ListView):
model = Enter
queryset = Enter.objects.filter(status=1).order_by('likes')[0]
template_name = 'competition.html'
competition.html:
<div class="container-fluid">
{% for entry in enter_list %}
<div class="row justify-content-center mt-4">
<div class="col-md-4">
<div class="card mb-4">
<div class="card-body">
<div>
<img class="card-img-top" src=" {{ entry.featured_image.url }}">
<div>
<p class="competitor text-muted">By: {{ entry.competitor }}</p>
</div>
</div>
<h2 class="card-title">{{ entry.title }}</h2>
<hr />
<p class="card-text text-muted h6">{{ entry.created_on}} <i class="far fa-heart"></i>
{{ entry.number_of_likes }}</p>
</div>
</div>
</div>
</div>
{% endfor %}
</div>
如果我从www.example.com列表中删除[0]
(或.first()
)views.py,页面上确实会呈现,但某些项目会重复-使用.distinct()
不会删除重复项
如何显示点赞数最高的条目?谢谢大家!
1条答案
按热度按时间vyswwuz21#
你可能想按喜欢的 * 数量 * 排序,这是按喜欢排序的另一种方式。通过执行
.order_by('-likes')
,您可以按照 liker 的主键降序排序,因此相同的Enter
会出现与likers一样多。如果你想按喜欢的数量订购,你可以使用:
然而,使用
[0]
或.first()
没有意义,那么这些不是查询集,而是Enter
对象。queryset
应该有一个QuerySet
类型的值,而不是模型对象。如果你只想显示最受欢迎的帖子,这是一个
DetailView
,因此你可以使用get_object
:然后它将该对象作为
object
传递给模板,因此您不需要使用{% for … %}
来枚举,您只需要呈现object
。