Первое, что вам нужно добавить, это related_name в внешнем ключе вашей модели,
class Post(models.Model):
category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='postcategory')
Затем вам нужно добавить несколько категорий в один и тот же вид. Вы можете добавить его с помощью простого набора запросов или используя get_context_data,
class HomeView(ListView):
template_name = 'home.html'
model = Category
context_object_name = 'all_categs'
def get_queryset(self):
return Category.objects.all()
def get_context_data(self):
context = super(HomeView, self).get_context_data()
context['latest_posts'] = Post.objects.order_by('-date_posted')[0:3] #or simply [:3]
# This will show your 3 latest posts you can add accordingly
return context
def get_success_url(self):
return reverse('home') #add your path
В HTML вам нужно показать это,
{% for post in latest_posts %}
<p>{{post.title}}</p>
#other attributes
{% endfor %}
{% for ct in all_categs %}
<div>
<div> {{ct.title}} </div>
{% for post in ct.postcategory.all|dictsortreversed:"date_posted" %}
<p> {{post.title}} </p>
# add other fields
{% endfor %}
</div>
{% endfor %}
Теперь вам решать, как вы хотите визуализировать свой внешний вид. Я не проверял этот код, если вы обнаружите какую-либо ошибку, сообщите мне или найдите ответ в SO,
Примечание. Django Queryset - Lazy, поэтому, если у вас много категорий, это
может замедлить время загрузки вашей страницы. Поэтому убедитесь, что вы улучшаете
скорость страницы с кешированием и прочим.
Edit-1: когда вы хотите показать два атрибута модели, вы можете использовать get_context_data. Если вы хотите добавить форму, вы можете добавить аналогичным образом.