django 2:在模板上呈现单个帖子和建议帖子

时间:2018-03-30 20:31:35

标签: django django-templates django-2.0

我正在使用Django 2,我想在一篇文章的博客页面中显示该文章的正文,并在底部显示3篇推荐文章。

不幸的是显示3篇文章部分不起作用。我没有收到任何错误它只是没有更具体地显示来自循环的块的任何部分:

我的观点

def detail (request, post_slug):
    post = get_object_or_404 (Post, slug=post_slug)
    suggested = Post.objects.all()[:3]

    return render (request, 'detail.html', {'post':post}, {'suggested':suggested})

和html显示建议的

<section class="read-next">

{% for a in suggested.all %}
    <a href="/{{a.slug}}" class="prev-post "  style="background-image:url({{a.image}})" >
        <div class="info">
            <div class="tag">We recommend</div>
            <h3 class="post-title">{{a.title}}</h3>
        </div>
    </a>
{% endfor %}
</section> <!-- .read-next -->

没有任何内容可以呈现此部分或无论何处添加循环。 在此先感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

当你致电render时,你应该返回一个上下文字典:

return render(request, 'detail.html', {'post':post, 'suggested':suggested})

render快捷方式的第四个参数是content_type,因此您当前的代码相当于:

return render(request, 'detail.html', context={'post':post}, content_type={'suggested':suggested})

答案 1 :(得分:2)

这里有几个问题。

  1. 渲染被称为错误。渲染的格式如下:

    返回渲染(request,template_name,context)

  2. context是一个单词字典,可用于在html页面上放置变量值。

    您要发送两个单独的词典进行渲染。所以现在你的上下文只是一个带有一个键的字典:“post”。包含建议的字典设置为content_type,而不是发送到上下文。

    所以你的观点需要成为:

     def detail (request, post_slug):
         post = get_object_or_404 (Post, slug=post_slug)
         suggested = Post.objects.all()[:3]
         context = {
             "post": post,
             "suggested": suggested
         }
    
         return render (request, 'detail.html', context)
    
    1. 因为您对Post对象(suggested = Post.objects.all()[:3])的查询集进行了切片,所以它现在是一个查询列表,而不是一个可用的查询集。所以你把它看作是一个列表。基本上这意味着你不要使用{% for a in suggested.all %}因为建议在切片后不再使用名为all的方法。
    2. 因此,您的模板应使用{% for a in suggested %}代替{% for a in suggested.all %}。之前没有以正确的方式工作的原因是因为问题#1之前的建议甚至不在上下文中。