Django中的过滤器和for循环

时间:2015-03-16 18:48:58

标签: html django for-loop pytorctl

如果这是一个显而易见的问题,我很抱歉,我是Django和Python的新手。我正在开发一个小博客应用程序。以下代码检索我的数据库中的所有帖子。我不想在主页面中显示所有这些内容。我只需要三个。我确信它是根据文档使用for循环和某种过滤器完成的。

https://docs.djangoproject.com/en/1.7/ref/templates/builtins/

views.py

def all(request):
    allPosts = Post.objects.all()
    context = {'Posts': allPosts}
    template = "home.html"
    return render(request, template, context)

home.html的

<div class="sidebar-module">
            <h4>Archive</h4>
            <ol class="list-unstyled">

            {% for singlePost in Posts %}
            <li><a href="#">{{singlePost.title}}</a></li>
            {% endfor %}
            </ol>
          </div>

1 个答案:

答案 0 :(得分:1)

由于您只需要查找3个帖子,因此无需提取所有条目,以下内容就足够了:

def all(request):
    """To get only three posts use a slice operation."""
    allPosts = Post.objects.all()[:3]
    context = {'Posts': allPosts}
    template = "home.html"
    return render(request, template, context)

您可以在官方文档中找到更多信息: https://docs.djangoproject.com/en/1.7/topics/db/queries/#limiting-querysets 如果您需要过滤结果,请使用相同的概念,但应用您的过滤器: https://docs.djangoproject.com/en/1.7/topics/db/queries/#retrieving-specific-objects-with-filters

另一方面,如果你打算在同一个帖子上使用所有这些,但只是想在同一个集合中限制特定部分(比如边栏等)上的3,那么你可以将它们全部取为在原始帖子中,然后在模板内循环:

<div class="sidebar-module">
    <h4>Archive</h4>
    <ol class="list-unstyled">

    {% for singlePost in Posts|slice:":3" %}
        <li><a href="#">{{singlePost.title}}</a></li>
    {% endfor %}
    </ol>
</div>

请注意,如果您遇到上述情况,上述操作会产生新的查询 加载问题,最好在视图中评估查询集,将其分配给列表 并使用评估的查询:

def all(request):
    """The bellow evaluates the queryset before it hits the template.
    So slicing in the template (example before) will not result in a new
    Queryset."""
    allPosts = list(Post.objects.all())
    context = {'Posts': allPosts}
    template = "home.html"
    return render(request, template, context)

您可以在此处找到有关评估的更多信息: https://docs.djangoproject.com/en/1.7/ref/models/querysets/#when-querysets-are-evaluated