У вас есть сообщения, отнесенные к категориям. Каждое сообщение может быть отнесено только к одной категории (так как у вас есть FK от Post
до Category
). И вы хотите, чтобы отображал все категории и 10 последних сообщений под каждой .
Я вижу несколько способов, как это решить. Самым простым является расширение модели Category
свойством, содержащим набор запросов для извлечения связанных постов так, как вы хотите, чтобы они были на главной странице.
class Post(models.Model):
title = models.CharField(max_length=255)
category = models.ForeignKey('Category', on_delete=models.CASCADE, related_name='posts')
date_posted = models.DateTimeField(default=timezone.now)
class Category(models.Model):
title = models.CharField(max_length=255)
@property
def posts_for_frontpage(self):
return self.posts.order_by('-date_posted')[:10]
class FrontpageView(ListView):
model = Category
template_name = 'frontpage.html'
context_object_name = 'categories'
def get_queryset(self):
# select some categories for frontpage
# all by default
return Category.objects.all()
и затем в шаблоне
{% for category in categories %}
<h1>{{ category.title }}</h1>
<hr />
{% for post in category.posts_for_frontpage %}
<h4>{{ post.title }}</h4>
{% endfor %}
<br />
<br />
{% endfor %}
Вы также можете поиграть с select_related
, чтобы уменьшить количество запросов, и с annotate
, чтобы получить все связанные сообщения.
Я использовал
*Informative*-*name*-*M*.*m*.*b*.jar
Где:
M = major version number
(измененный, когда обратная совместимость не обязательно сохраняется)
m = minor version number
(дополнения функции и т.д.)
b = build number
(для выпусков, содержащих исправления ошибок)