如果这是一个显而易见的问题,我很抱歉,我是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>
答案 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