我正在开发一个基本的帖子应用程序,每个帖子可以有很多孩子,每个帖子都可以有一个父母。我正在实现这样的模型:
class Post(models.Model):
title = models.CharField(max_length=200)
author = models.CharField(max_length=200)
parent = models.IntegerField(default=0)
整数字段将引用另一个帖子的ID,而父母为0的任何帖子都不会有父母。
在主模板中,我遇到了可靠地访问父帖子项的问题。我正在使用Paginator遍历主要的父帖子集,并且在每个帖子中我需要遍历子帖子列表。
为每个帖子设置一个新属性以包含子项列表有时可以正常工作,但有时孩子在重复刷新浏览器时根本不会显示。以下是观点:
def home(request):
parent_posts = Post.objects.filter(parent__exact=0)
child_posts = [] # also try to access a second list from the template
for post in parent_posts:
children = Post.objects.filter(parent__exact=post.id)
child_posts.append(children)
post.children = children # this seems to work sometimes
paginator = Paginator(parent_posts, 10)
page = request.GET.get('page')
try:
post_list = paginator.page(page)
except PageNotAnInteger:
post_list = paginator.page(1)
except EmptyPage:
post_list = paginator.page(paginator.num_pages)
context = {
'post_list': post_list,
'child_posts': child_posts,
}
return render(request, 'home.html', context)
以下是我在模板中尝试做的一个示例:
<h2>Posts</h2>
{% for post in post_list %}
{{ post.title }} by {{ post.author }}
{% for child in post.children %}
Child post: {{ child.title }} by {{ child.author }}
{% endfor %}
{% endfor %}
正如我所提到的,这种方法似乎有效,但有时刷新页面时根本不会显示任何子帖。这是为什么?是否为视图中的每个帖子设置一个新属性,甚至应该有效?
我也在第二个列表中循环,但是还没有任何工作:
<h2>Posts</h2>
{% for post in post_list %}
{{ post.title }} by {{ post.author }}
{% for child in child_posts.forloop.parentloop.counter0 %}
Child post: {{ child.title }} by {{ child.author }}
{% endfor %}
{% endfor %}
我还想过将两个父母和孩子的列表分组到视图中的元组列表中,但我不知道如何用分页来做到这一点。
我不确定这是一个简单的解决方案,还是需要完整的返工,但我感谢您的帮助!
答案 0 :(得分:0)
你可以像这样使用ForeignKey“自我”:
class Post(models.Model):
title = models.CharField(max_length=200)
author = models.CharField(max_length=200)
parent = models.ForeignKey('self', null=True, blank=True)
然后,在您的视图上发送一个嵌套列表:
parent_posts = Post.objects.filter(parent=None)
posts = []
for p in parent_posts:
children = Post.objects.filter(parent=p)
posts.append([p, children])
然后,在您的模板上,您应该没有问题循环:
<h2>Posts</h2>
{% for post in posts %}
{{ post.0.title }} by {{ post.0.author }}
{% for child in post.1 %}
Child post: {{ child.title }} by {{ child.author }}
{% endfor %}
{% endfor %}