我正在制作一个博客首页,并希望按时间顺序从多个模型创建一个帖子列表。到目前为止,我有:
/videos/models.py:
class Video(models.Model):
title = models.CharField(max_length=100, unique=True)
slugline = models.SlugField(max_length=100, unique=True)
published_date = models.DateTimeField('date published')
link = models.URLField()
....
/articles/models.py:
class Content(models.Model):
title = models.CharField(max_length=100, unique=True)
slugline = models.SlugField(max_length=100, unique=True)
body = models.TextField()
published_date = models.DateTimeField('date published')
image = models.ImageField(upload_to='article_pics/')
家/ views.py:
class FrontPage(generic.ListView):
template_name = 'home/index.html'
context_object_name = 'front_articles_list'
queryset = Video.objects.all()
def get_context_data(self, **kwargs):
context = super(FrontPage, self).get_context_data(**kwargs)
context['articles'] = Content.objects.filter(
published_date__lte=timezone.now()
).order_by('-published_date')[:5]
context['videos'] = Video.objects.filter(
published_date__lte=timezone.now()
).order_by('-published_date')[:5]
return context
在我的模板index.html中,我引用了这样的数据:
{{ front_articles_list.0.title }}
{{ front_articles_list.0.published_date }}
{{ front_articles_list.1.title }}
等。
我不确定这是最好的方法,因为我希望能够列出最近的五篇帖子,无论是视频,文章,还是两者兼而有之,这两个模型不共享相同的字段。
我尝试使用for循环,但它确实搞砸了我的格式。设置页面以便以这种方式插入数据的方式似乎更容易。
第二个问题是我的页面首先显示最旧的帖子,而不是最新的帖子,它只是从视频模型中提取 - 我假设因为它是FrontPage视图中queryset变量中列出的那个。
答案 0 :(得分:0)
要做的是查询每个模型的最新5个,然后在Python中对它们进行排序。你不会是一个查询集,所以使用ListView是没有意义的:你只需要一个标准的模板视图。
def get_context_data(self, **kwargs):
articles = Article.objects.order_by("-published_date")[:5]
videos = Video.objects.order_by("-published_date")[:5]
items = list(articles) + list(videos)
items.sort(key=lambda i: i.published_date, reverse=True)
return {"items": items[:5]}