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个多对多字段的主要内容,如果未能解决你的问题,请参考以下文章

Django 多对多字段过滤器列表

Django如何过滤多对多字段中的对象,而不是原始查询集

在Django中按关系字段过滤多对多关系

如何以 django 形式过滤多对多字段

过滤多对多字段Django

DJANGO:在模板中显示多对多的附加字段