Django "for"按日期循环



我正在做博客应用程序。我做到了:

{% for entry in entry.all %}
<div class="timelinestamp">
...
</div>
<br />
<br />
<br />
<br />
{% endfor %}

而且几乎一切都很好。我在我的管理面板中更改了一个条目(第一个条目…(。从那以后,我的帖子顺序发生了变化。。。有人能解释一下为什么吗?或者告诉我们如何使用循环渲染按日期排序的所有条目?

class Entry(models.Model):
title = models.CharField(max_length=120)
pub_date = models.DateField(null=False)
body = models.TextField()
image = models.ImageField(upload_to='images/', max_length = 100)
def __str__(self):
return self.title

pub_date字段不是我数据库中的主键!我正在使用Django 2.1

来自文档:

如果查询没有指定顺序,则会以未指定的顺序从数据库返回结果。只有通过一组唯一标识结果中每个对象的字段进行排序时,才能保证特定的排序。例如,如果名称字段不是唯一的,则按其排序并不能保证具有相同名称的对象总是以相同的顺序出现。

看起来您想按pub_date订购?使用ordering:

class Entry(models.Model):
...
class Meta:
ordering = ['-pub_date']

如果您创建了没有ordering元选项的模型定义,则数据库中的项目不会强制执行任何排序,每次执行Model.objects.all()时,它都会为您提供没有任何排序的项目。如果你想按特定顺序查询,你可以:

  • ordering选项添加到模型定义的Meta选项中-这需要数据库迁移
  • 修改您的查询以像Model.objects.all().order_by('-pub_date')一样强制排序,还可以将查询作为上下文对象传递给模板,如:
  • views.py-

    entries_by_pub_date = Model.objects.all().order_by('-pub_date') context['entries_by_pub_date'] = entries_by_pub_date

  • 模板

  • {% for entry in entries_by_pub_date %} ... {% enfor %}

据我所见,您还没有为Entry模型定义排序顺序。这意味着您将以未定义的顺序处理这些条目。要订购您的条目,您可以在Entry:上设置默认排序顺序

class Entry(models.Model):
title = models.CharField(max_length=120)
pub_date = models.DateField(null=False)
body = models.TextField()
image = models.ImageField(upload_to='images/', max_length = 100)
def __str__(self):
return self.title
class Meta:
ordering = ('-pub_date',)

或者,如果这不是你想要的,你可以在你的视图中订购你的查询集:

Entry.objects.all().order_by('-pub_date')

最新更新