在单个context_object_name下将多个模型传递给模板

时间:2014-10-24 22:41:58

标签: python django

我正在制作一个博客首页,并希望按时间顺序从多个模型创建一个帖子列表。到目前为止,我有:

/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变量中列出的那个。

1 个答案:

答案 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]}