django - Django 模板中的循环 : how to control the loop iterator?

标签 django loops django-templates

我正在使用 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/

相关文章:

python - Django:在模板中访问 OneToOneField

python - 如何在Django中使用AJAX和JSON?

python - Django休息框架: correctly handle incoming array of model ids

r - 在 r 中循环 ggplot2 公式

django - 如何在 TextFields 中保存链接

python - 测试时为真的 Django 变量

jQuery 无限循环更新状态

javascript - Javascript 中的毕达哥拉斯三元组公式 - Project Euler Prob 9

python - 如何使用无效的 Django 表单跳转到 anchor ?

django - 渲染时捕获NoReverseMatch:反向使用参数'accounts_profile_view''('和关键字参数',)'的'{}'