假设我有一个嵌套类别的博客。
我正在显示它们:
{% for category in categories %}
<h1> {{category.title}} </h1>
{% for subcategory in category.subcategories %}
<h1> {{subcategory.title}} </h1>
{% endfor %}
{% endfor %}
我需要通过一些已发布的帖子对类别及其子类别进行排序。
我该怎么做?
也许我可以在模型中使用Meta类中的排序,但我不知道是否可以通过许多过滤的外键来排序。我也不想在模型中这样做,因为我不想总是按顺序排序。
或许我可以编写某种模板标签来对相关项进行排序,看起来很方便,但我不知道如何。
或许还有其他一些更好的方法?
更新:
我创建了一个过滤器,按帖子数量对类别进行排序:
@register.filter
def sortbyposts(categories):
categories = categories.annotate(number_of_posts=Count('posts')).order_by('-number_of_posts')
return categories
我可以像这样使用它:
{% for category in categories|sortbyposts %}
<h1> {{category.title}} </h1>
{% for subcategory in category.subcategories|sortbyposts %}
<h1> {{subcategory.title}} </h1>
{% endfor %}
{% endfor %}
但现在我需要通过过滤的帖子来计算Count()。我能这样做吗?
答案 0 :(得分:0)
我的解决方案:
创建模板标签:
@register.filter
def sortbypostcount(children):
children_postcount = []
for child in children:
child.postcount = child.posts.filter(published=True,rational=False).count()
children_postcount.append(child)
children_postcount.sort(key=lambda x: x.postcount, reverse = True)
return children_postcount
用它来对结果进行排序:
{% for category in categories|sortbypostcount %}
<h1> {{category.title}} </h1>
{% for subcategory in category.subcategories|sortbypostcount %}
<h1> {{subcategory.title}} </h1>
{% endfor %}
{% endfor %}