我在Django中有一个Post模型,它看起来像这样:
class Post(models.Model):
post = models.TextField()
user = models.ForeignKey(User, on_delete=models.CASCADE)
timestamp = models.DateTimeField(auto_now=True)
我想对每个用户每天的帖子进行排序和显示。因此,如果一个用户在周一发布了20条帖子,另一个用户周二发布了15条帖子,周三发布了4条帖子,那么它们将被分组并显示。我不需要每个用户或每天的帖子总数,只需要一种将用户每天发布的所有帖子分开显示在一起的方式。
示例(希望显示在一页上(:星期一:用户1:post1,post2,post2。用户2:post1 post2,post3,post4,post5。星期二:用户2:post1,post2,post3。user3:post1,post2….适用于所有帖子和用户
我试过posts = Post.objects.all().order_by('-timestamp','user')
,它显示所有帖子,但我不知道如何按用户每天对帖子进行分组。
您应该先按截断日期排序,然后按用户排序,然后再按时间戳排序,以便结果始终相同。任何帖子的排序都不可能以不可预测的方式改变它们的顺序。像这样:
posts = Post.objects.all().order_by(TruncDate('timestamp').desc(),'user','timestamp')
我想明白了。我需要重新集结。以下代码有效。我花了两天时间才弄明白。
{% regroup posts by timestamp|date as date_list %}
{% for time in date_list %}
{% regroup time.list by user as user_list %}
{% for user in user_list %}
<div class="card" style="width: 30rem;">
<div class="card-body">
<div>
<img src="{{ user.grouper.profile_pic.url }}" class="rounded-circle mr-3" height="50px" width="50px" alt="avatar" style="float:left">
<a href="{% url 'profile' user.grouper.id %}"><h5>@{{user.grouper}}</h5></a>
</div>
<p class="card-title">{{ time.grouper}}</p>
{% for x in user.list %}
<li><p class="card-text">{{ x.post}}</p></li>
{% endfor %}
</div>
{% endfor %}
</div>
{% endfor %}