我正在使用 Django 显示帖子列表。每个帖子都有一个“is_public”字段,因此如果一个帖子的“is_public”等于 False,则不应向用户显示该帖子。另外,我想在一页中显示固定数量的帖子,但该数量可能会根据 View 而变化。
我决定在模板中裁剪查询集,因为一些 View 使用相同的模板,在 View 中生成它意味着大量重复的代码。
如果用 python 编写,它应该如下所示:
i=number_of_posts_to_show_in_one_page
while i:
if qs[i].is_public == True:
#show qs[i] to the page
i--
由于django模板不支持while循环,而且for循环似乎很难控制,有没有办法实现这一点?或者我应该用另一种方式来做?(一个想法是在循环之前裁剪 qs)谢谢!
更新:
我编写了这个模板标签来预处理查询集:
@register.simple_tag(takes_context=True)
def pre_process_list(context,list,numbers):
#if not user.has_perm('admin'):
context['result_list']=list.filter(is_public=True, is_removed=False)[0:numbers]
#else:
#context['result_list']=list[0:numbers]
return ''
在模板中使用 for 循环之前,我会将查询集传递给此模板标记,并使用简单的 for 循环来显示其结果。
如果将来我想向管理员显示非公开帖子(尚未决定),我可以编写一些类似于评论的逻辑,并在模板中将它们设置为不同的样式。
最佳答案
{% for post in posts %}
{% if post.is_public %}
{{ post }}
{% endif %}
{% endfor %}
尽管这对于 manager 来说是一个完美的用例。
您可以编写一个简单的管理器来过滤公共(public)帖子。
class PublicPostManager(models.Manager):
def get_query_set(self):
return super(PublicPostManager, self).get_query_set().filter(is_public=True)
然后您将其添加到您的 Post
类中:
class Post(models.Model):
...
public = PublicPostManager()
然后您可以将 post.public.all()
作为 public_posts
传递到您的模板并简化您的循环:
{% for post in public_posts %}
{{ post }}
{% endfor %}
关于django - Django 模板中的循环 : how to control the loop iterator?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8517818/