使用请求函数从 Django 模型渲染多个对象

Render multiple objects from Django model using request function

正在将一些职位列表添加到我的 Django 站点的首页。目前列出了 20 个工作用于测试目的。 我有一个相当简单的 Django 模型,其中包含作业状态(活动、非活动、存档)和创建作业列表的时间等属性,因此我可以按时间顺序排列这些。

我希望能够在页面顶部仅显示 4 个最近的职位,同时在此下方的列表中显示剩余的 16 个职位。

这是我目前所知道的...

Models.py

    from django.db import models

    class Job(models.Model):

    ACTIVE = 'active'
    INACTIVE = 'inactive'
    ARCHIVED = 'archived'

    CHOICES_STATUS = (
       (ACTIVE, 'Active'),
       (INACTIVE, 'Inactive'),
       (ARCHIVED, 'Archived')
    )

    status = models.CharField(max_length=20, choices=CHOICES_STATUS, default=ACTIVE)

    created_at = models.DateTimeField(auto_now_add=True)


    

为了在网站的首页上呈现作业,然后我在如下视图中引用作业模型。

Views.py

from django.shortcuts import render, redirect
from apps.job.models import Job

def frontpage(request):
    jobs=Job.objects.filter(status=Job.ACTIVE).order_by('-created_at')[0:4]

    all_jobs=Job.objects.filter(status=Job.ACTIVE).order_by('-created_at')

    return render(request, 'core/frontpage.html', {'jobs': jobs, 'jobs':all_jobs})

这确实使作业出现在首页上,但配置似乎是由最后一个请求决定的,即 all_jobs=Job.objects.filter(status=Job.ACTIVE).order_by('-created_at')

我知道这一点,因为如果我从 frontpage.html 中删除 Bulma 的 <div class="column is-one-quarter">(我将其用作故障保护),django 会在页面顶部呈现所有 20 个帖子,而如果我使用 jobs=Job.objects.filter(status=Job.ACTIVE).order_by('-created_at')[0:4] 作为最后一个请求,我在页面顶部看到了 4 个最新帖子,在这些帖子下方看到了相同的 4 个最新帖子。

问题是,I/how 能否在我的请求中引用相同的模型并期望 django return 所述模型中的一组不同的对象?

可以分享模板吗?无论如何,我想问题出在这里:

return render(request, 'core/frontpage.html', {'jobs': jobs, 'jobs':all_jobs})

您正在尝试向字典添加两个相同的关键字:'jobs' 和 'jobs'。应该是这样的:

return render(request, 'core/frontpage.html', {'jobs': jobs, 'all_jobs':all_jobs})

然后在模板中使用作业和 all_jobs 对象

如前所述。 return render(request, 'core/frontpage.html', {'jobs': jobs, 'all_jobs':all_jobs}) 和 在 'core/frontpage.html' .. 第二次 'jobs' 出现,您想列出所有工作的地方..将其替换为 'all_jobs'..

进一步解释,

  • render() 的第三个参数是一个 dictionary.Its 调用的上下文。 (我猜)
  • 它的键值对。引号中的是 keys.After ':' 是它的值。值可以是任何数据类型或对象。
  • 这些键被发送到模板,即您正在呈现的 html 页面,此处 'core/frontpage.html'。
  • 这些键可以用作模板(html 页面)中的变量,例如 .. 遍历它,如果它是一个可迭代的(像列表或像这里一样,一个查询集)
  • 在您的代码中,您分配了键 'jobs' 两次.. {'jobs': jobs, 'jobs':all_jobs}..第二个覆盖第一个。