【发布时间】:2012-01-21 00:21:20
【问题描述】:
我正在使用 Django 来显示帖子列表。每个帖子都有一个“is_public”字段,因此如果一个帖子的“is_public”等于 False,则不应向用户显示。另外,我想在一页中显示固定数量的帖子,但这个数字可能会根据浏览量而变化。
我决定在模板中裁剪查询集,因为一些视图使用相同的模板,在视图中生成它意味着很多重复的代码。
如果是用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循环来显示它的结果。
如果将来我想向管理员显示非公开帖子(尚未决定),我可以编写一些类似于评论的逻辑,并在模板中将它们设置为不同的样式。
【问题讨论】:
-
你最好在你的视图中构造正确的QuerySet。这样的逻辑属于那里,并且更易于管理。
-
该模板将被许多视图使用,所以我宁愿不要在这些视图中一次又一次地重复自己。另外,最初我有向管理员展示非公开查询集的想法,这就是为什么我不想事先裁剪查询集。这可能太复杂了,所以没关系
标签: django loops django-templates