[英]Django - How to sort through a queryset based on the value of an attribute
我创建了以下模型,用于存储html5横幅的信息。 我有一个ForeignKey将横幅与特定项目相关联。
class BannerCode(models.Model):
ROUNDS_LIST = (
('1', '1'),
('2', '2'),
('3', '3'),
('4', '4'),
('5', '5'),
('6', '6'),
)
project = models.ForeignKey(Project)
client = models.ForeignKey(Client, null=True, blank=True)
name = models.CharField(max_length=256, null=True, blank=True)
width = models.CharField(max_length=3, null=True, blank=True)
height = models.CharField(max_length=3, null=True, blank=True)
review_round = models.CharField(max_length=3, choices=ROUNDS_LIST, default=1)
我需要在我的模板中打印出类似所需的输出:
第1轮
第2轮
我无法理解如何遍历对象并按照review_round属性进行排序。
我创建了一个自定义过滤器,并能够在一个长列表中对它们进行排序:
@register.filter
def sort_by(queryset, order):
return queryset.order_by(order)
在模板中:
{% for b in project.bannercode_set.all|sort_by:'review_round' %}
{{ b.review_round }}
{% endfor %}
这个循环非常适合输出这样的东西:
电流输出
如何创建一个与我想要的输出匹配的for循环?
在你看来:
banners = BannerCode.objects.all().order_by('review_round')
***如果你想逆转订单,请使用'-review_round'
然后在你的模板中:
{% for item in banners %}
<li>{{ item.name }}</li>
{% endfor %}
您更改{{ b.review_round }}
在你的模板{{ b.name }}
在这种情况下,您要么必须在模板中有不同的部分用于不同的审核轮次,要么以不同的方式定义模板的上下文以呈现标题。
这是一个定义变量review_round_groups
来保存模板上下文的示例。 review_round_groups
是一个字典,它将每个部分的标题映射到它应该呈现的查询集(在这种情况下,每个查询集都是对不同的round_review进行过滤的结果):
review_round_groups = {}
for review_round_int in BannerCode.ROUNDS_LIST: # Group BannerCode's into review rounds
review_round_int = review_round_int[0] # Value to filter on
review_round_groups['Round %d' % review_round_int] = BannerCode.objects.filter(review_round=review_round_int)
然后在你的模板中:
{% for banner_group_name, banner_qs in review_round_group.items %}
<h1>{{ banner_group_name }}</h1>
{% if banner_qs.exists %}
<ul>
{% for banner in banner_qs %}
<li>{{ banner.name }}</li>
{% endfor %}
</ul>
{% endif %}
{% endfor %}
这应该将所有不同的审核轮次呈现为无序列表,如果某个review_round没有横幅,则它将不会显示该组。 如果您仍想呈现空审核轮组的标头,只需删除{% if banner_qs.exists %}
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.