Рендеринг нескольких объектов из модели Django с помощью функции запроса
Работаю над добавлением некоторых объявлений о вакансиях на первую страницу моего 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')
.
Я знаю это, потому что если я удалю <div class="column is-one-quarter"> (который я использую для подстраховки) из frontpage.html
django отображает все 20 сообщений в верхней части страницы, тогда как если я использую jobs=Job.objects.filter(status=Job.ACTIVE).order_by('-created_at')[0:4]
в качестве последнего запроса, я вижу 4 последних сообщения в верхней части страницы и те же 4 последних сообщения под ними.
Вопрос в том, могу ли я/как я могу ссылаться на одну и ту же модель в моем запросе и ожидать, что django вернет другой набор объектов в этой модели?
Можете ли вы поделиться шаблоном? В любом случае, я полагаю, что проблема здесь:
return render(request, 'core/frontpage.html', {'jobs': jobs, 'jobs':all_jobs})
Вы пытаетесь добавить два одинаковых ключевых слова в dict: 'jobs' и 'jobs'. Должно быть что-то вроде:
return render(request, 'core/frontpage.html', {'jobs': jobs, 'all_jobs':all_jobs})
А затем используйте объекты jobs и all_jobs в своем шаблоне
Как сказано.
return render(request, 'core/frontpage.html', {'jobs': jobs, 'all_jobs':all_jobs})
и
в 'core/frontpage.html' ... второй раз появляется 'jobs', где вы хотите перечислить все вакансии... замените его на 'all_jobs'...
Дальнейшее объяснение,
- Третьим аргументом render() является словарь. Он называется контекст. (я предполагаю)
- Это пары ключ-значение. Те, что в кавычках - ключи. После ':' - значение. Значение может быть любым типом данных или obj. .
- Эти ключи отправляются в шаблон, т.е. в html-страницу, которую вы отображаете, здесь 'core/frontpage.html'.
- Эти ключи могут быть использованы как переменные в шаблоне (html странице), например ... цикл через него, если это iterable (как список или как здесь, queryset) .
- В вашем коде, вы назначили ключ 'jobs' дважды...
{'jobs': jobs, 'jobs':all_jobs}
... второе переопределяет первое.