我正在做博客应用程序。我做到了:
{% 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')