cy内模板中的Django通道族

2024-09-30 03:22:15 发布

您现在位置:Python中文网/ 问答频道 /正文

在一个简单视图中,我在模板中传递一个族,如下所示:

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

我在模板中呈现如下:

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

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

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

Tags: in模板idforobjectsrequestdefpage
2条回答

令人惊讶的是,你怎么不明白在一个循环中重复赋值给同一个变量只会得到last

但无论如何,您不需要这些代码。您应该只遵循模板中的关系

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

(你还没有展示你的模型,所以我假设博客和帖子之间的相关名称叫做post_set,根据需要进行更改

更新

那是不对的。您不需要使用for循环。如果您需要获取最后5行,您可以这样做,即:

def page(request):
    family= Author.objects.all().order_by('-pk')[:5]
    return render(request, "myapp/page.html", {'family':family})

另一种方法是限制模板中的结果:

{% for item in family %}
    {% if forloop.counter < 6 %}
       {{ item.pk }}
    {% endif %}
{% endfor %}

相关问题 更多 >

    热门问题