gpt4 book ai didi

python - 如何在 Django 的同一页面上拆分帖 subview

转载 作者:太空狗 更新时间:2023-10-30 01:04:19 25 4
gpt4 key购买 nike

我不知道这个问题是否有意义,但我对此感到很困惑。我有一个帖子 ListView ,它正在此处呈现一些帖子。

我的问题是如何拆分页面的各个部分。像这样。 explain view

制作这种 View 的方法应该是什么。

这是我的帖子view.py

posts/view.py

class PostListView(ListView):
model = Post
template_name = 'posts/home.html'
context_object_name = 'posts'
ordering = ['-date_posted']

def get_queryset(self):
if not self.request.user.is_authenticated:
return Post.objects.all()[:10]
else :
return super().get_queryset()

posts/models.py

from django.db import models
from django.utils import timezone
from slugger import AutoSlugField
from django.contrib.auth.models import User
from django.urls import reverse
# Create your models here.

def upload_location(instance, filename):
return "%s/%s" %(instance.slug, filename)

class Category(models.Model):
title = models.CharField(max_length= 60)
slug = AutoSlugField(populate_from='title')
parent = models.ForeignKey('self',blank=True, null=True ,related_name='children',on_delete=models.CASCADE)
updated = models.DateTimeField(auto_now=True, auto_now_add=False)
timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)

def __unicode__(self):
return self.title

def __str__(self):
return self.title



class Post(models.Model):
title = models.CharField(max_length=120)
slug = AutoSlugField(populate_from='title')
image = models.ImageField(
upload_to=upload_location,
null=True,
blank=True,
)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
content = models.TextField()
date_posted = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(User, on_delete=models.CASCADE)


def __str__(self):
return self.title


def get_absolute_url(self, slug=None):
return reverse("posts-detail", kwargs={"slug": self.slug})

最佳答案

您已将帖子分配到类别。每个帖子只能分配给一个类别(因为您有从 PostCategory 的 FK)。并且您希望显示所有类别和每个类别下的 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 来获取所有相关帖子。

关于python - 如何在 Django 的同一页面上拆分帖 subview ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54971221/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com