Django模板过滤2个多对多字段
Posted
技术标签:
【中文标题】Django模板过滤2个多对多字段【英文标题】:Django template filters 2 ManytoMany fields 【发布时间】:2014-05-25 04:33:27 【问题描述】:我正在用 Django 编写一个应用程序,该应用程序获取一个项目中的所有运动员,将它们分类(轻量级、重量级等),然后显示每个类别中的运动员,从得分最高的运动员到得分最低的运动员排序运动员。我无法获得将运动员分类的模板;要么显示所有运动员,要么不显示。
以下是我的模型和模板的相关部分:
一个运动员可能属于多个类别,每个类别都有多个运动员。类别也按日期排序。
models.py
class Entry(models.Model):
athlete = models.ForeignKey(Athlete, related_name='entries')
event = models.ForeignKey(Event, related_name='entries')
athlete_category = models.ManyToManyField(Category, related_name='entries')
athlete_score = models.CharField(max_length=20, blank=True)
placing = models.SmallIntegerField(blank=True, null=True)
class Category(models.Model):
category_name = models.CharField(max_length=100)
class CategoryOrder(models.Model):
event = models.ForeignKey(Event)
category = models.ForeignKey(Classes)
category_order = models.SmallIntegerField()
event_placings.html
% for category in categories %
<p> category.category_name </p>
% for entry in entries %
% for athlete_category in entry.athlete_category %
% if athlete_category == category %
<p> entry.athlete.first_name entry.athlete.last_name - entry.placing </p>
% endif %
% endfor %
% endfor %
% endfor %
该模板应该列出每个类别,然后根据他的排名列出该类别中的所有运动员。输出应该是:
男士轻量级 约翰·多伊 - 1 乔公众 - 2
女子轻量级 简·多伊 - 1 伊娃布劳恩 - 2
等等
目前我得到:
男子轻量级
女子轻量级
它列出了类别,但没有列出运动员。我哪里错了?
【问题讨论】:
【参考方案1】:看起来您的模板中有不必要的循环。可能是这样的:
% for category in categories %
<p> category.category_name </p>
% for entry in category.entries %
<p> entry.athlete.first_name entry.athlete.last_name - entry.placing </p>
% endfor %
% endfor %
要维护运动员的顺序,您可以在 Entry
类上使用 Meta ordering
或在 Category
类上使用类似方法 def athletes_ordered(self)
def athletes_ordered(self):
return self.entries.order_by('athlete_score')
在第二种情况下,您必须将模板中的category.entries
替换为category.athletes_ordered
。
【讨论】:
以上是关于Django模板过滤2个多对多字段的主要内容,如果未能解决你的问题,请参考以下文章