将多个模型传递到单个上下文下的模板

2024-06-17 15:34:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在制作一个博客frontpage,并想创建一个从多个模型按时间顺序的帖子列表。到目前为止,我已经:

/视频/模型.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()
....

/条/模型.py公司名称:

^{pr2}$

家/视图.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

在我的模板中,索引.html,我引用的数据如下:

{{ front_articles_list.0.title }}
{{ front_articles_list.0.published_date }}

{{ front_articles_list.1.title }}

等等

我不确定这是最好的方法,因为我希望能够列出最近的五篇文章,不管是视频、文章,或者很可能是两者的混合,而且这两种模式并不共享相同的领域。在

我试着用for循环来处理这些问题,但它真的搞砸了我的格式。页面的设置方式似乎更容易插入数据。在

第二个问题是,我的页面首先显示的是最旧的帖子,而不是最新的帖子,而且它只是从视频模型中提取出来的——我假设是因为它是FrontPage视图中queryset变量中列出的那个。在


Tags: py模型名称date视频titlemodelsvideo
1条回答
网友
1楼 · 发布于 2024-06-17 15:34:27

要做的是查询每个模型中最新的5个,然后用Python对它们进行排序。您将不会是一个queryset,所以使用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]}

相关问题 更多 >