【发布时间】:2011-05-27 15:36:42
【问题描述】:
有可能吗?
我的问题是,我的主页上有几列,所有这些列都需要显示使用不同过滤器的模型,以及不同的模型。我不想获取模型并在视图中对其进行过滤,然后将它们作为变量传递给包含所有“model1_filterAppliedA”、“model1_filterAppliedB”的主页。这似乎有点矫枉过正。我想要一个很好的方式来说“在此列中显示此模型的此过滤查询集”“在另一列中使用此过滤器显示此其他查询集”。
在 django 中实现这一目标的最佳方法是什么?
谢谢
编辑:
所以经过一段时间的实验;
选项 1:
我有一个看起来像这样的模板标签
@register.inclusion_tag('app/accordion_column.html', takes_context=True)
def accordion_by_filter(context, f):
user = context['request'].user
print "f: " + str(f)
filetered_mobjects = Modell.objects \
.filter(creator=user.userprofile) \
.filter(state=f) \
.order_by('-created')[0:10]
return {'mobjects': filetered_mobjects}
然后从我的模板中调用它
{% load mytags %}
{% accordion_by_filter 'A' %}
并且手风琴_column.html 扩展了我的其他模板并且只是循环遍历mobjects。 现在,当我需要在 main_column 中显示所有 mobjects 但由 'B' 过滤时,我会做同样的事情,但用accordion_by_filter 'B' 调用它
所以对于索引视图,它具有手风琴列(左侧)main_column 和 right_sidebar。对于要应用的每个过滤器,将对数据库进行三个单独的命中。我认为这没问题,因为另一种选择是获取所有 mobjects 并在结果列表中过滤?
选项 2;过滤器,加载任何模板的视图应该获取所有或一些模型,并将其在变量中铲到模板中,然后通过模板过滤器像普通列表一样过滤。所以这应该是一次访问数据库但结果会更重,并且它的过滤将在模板过滤器中计算多次,而不是告诉数据库这样做。
过滤器:
@register.filter def state(mobjects_list, arg):
filtered = []
for p in mobjects_list:
if p.state == arg:
filtered.append(p)
return filtered
在视图返回我可以做的 mobjects 的任何模板中
for p in mobjects|state:'A'
....
哪个选项更可取,最快?
【问题讨论】:
标签: django model-view-controller templates views django-templates