首页 > 解决方案 > Django在模板中传递家庭循环

问题描述

在一个简单的视图中,我在模板中传递了一个家庭,如下所示:

def page(request):
    family= Author.objects.all()
    return render(request, "myapp/page.html", {'family':family})

我在这样的模板中渲染:

{% for item in family %}
   {{ item.pk }}
{% endfor %}

但是,如果我把我的家人放在一个 for 循环中;例如:

def page(request):
    family = []
    for i in range(5):
        family= Author.objects.filter(name='John')[i]
    return render(request, "myapp/page.html", {'family':family})

它不会在模板中呈现任何内容...

任何的想法?

编辑 1

我的应用程序中有更多用户,每个用户都有不同的博客,每个博客都有不同的帖子......所以当用户登录时,我需要显示他的博客,并且每个博客显示最后 5 个帖子。我愿意:

@login_required
def page(request):
    user = request.user.id
    numblog = Blog.objects.filter(user_id=user).aggregate(c=Count('id'))
    for i in range(numblog['c']):
        blogquery = Blog.objects.filter(user_id=user)[i]
        postquery = Post.objects.filter(blog_id=blogquery.pk)[:5]
    return render(request, "myapp/page.html", {'blogquery ':blogquery,'postquery ':postquery  })

模板中的预期结果:

{% for b in blogquery %}
    {{ b.name }} ### here name of blog 
        {% for p in postquery %}
            {% if p.blog_id == b.pk %}
                {{ p.content }} ### here last 5 post of THAT blog
            {% endif %}
        {% endfor %}
{% endfor %}

编辑 2

在一个视图中,如果我打印结果它可以工作但不能在模板中呈现

@login_required
def page(request):
    user = request.user.id
    numblog = Blog.objects.filter(user_id=user).aggregate(c=Count('id'))
    for i in range(numblog['c']):
        blogquery = Blog.objects.filter(user_id=user)[i]
        postquery = Post.objects.filter(blog_id=blogquery.pk)[:5]
        for p in postquery:
            print (blogquery.pk, p.pk)
    return render(request, "myapp/page.html", {'blogquery ':blogquery,'postquery ':postquery  })

标签: pythondjangodjango-views

解决方案


令人惊讶的是,您不明白在循环中重复分配给同一个变量只会给您最后一个值。

但是,您不需要任何此代码。您应该只遵循模板中的关系。

@login_required
def page(request):
    blogs = Blog.objects.filter(user=user).prefetch_related('post_set')
    return render(request, "myapp/page.html", {'blogs ': blogs })
{% for blog in blogs %}
    {{ blog.name }}
    {% for post in blog.post_set.all|slice:"5" %}
        {{ post.content }}
    {% endfor %}
{% endfor %}

(你没有展示你的模型,所以我假设从 Blog 到 Post 的 related_name 被称为post_set,根据需要进行更改。


推荐阅读