Django:我如何遍历分页列表中的第二个列表?

时间:2014-11-29 19:45:28

标签: django django-templates django-views

我正在开发一个基本的帖子应用程序,每个帖子可以有很多孩子,每个帖子都可以有一个父母。我正在实现这样的模型:

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 %}

我还想过将两个父母和孩子的列表分组到视图中的元组列表中,但我不知道如何用分页来做到这一点。

我不确定这是一个简单的解决方案,还是需要完整的返工,但我感谢您的帮助!

1 个答案:

答案 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 %}