Django模板过滤了2个ManytoMany字段

时间:2014-04-11 06:53:04

标签: python django django-templates django-orm

我正在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 %}

模板应该列出每个类别,然后根据他的位置列出该类别中的所有运动员。输出应为:

男子轻量级 John Doe - 1
Joe Public - 2

女性轻量级 Jane Doe - 1
伊娃布劳恩 - 2

目前我得到:

男子轻量级

女性轻量级

它列出了类别,但没有列出运动员。我哪里错了?

1 个答案:

答案 0 :(得分:0)

您的模板中似乎有不必要的循环。可能就是这样:

{% 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,或在def athletes_ordered(self)课程上使用类似

的方法Category
def athletes_ordered(self):
    return self.entries.order_by('athlete_score')

在第二种情况下,您必须在模板中将category.entries替换为category.athletes_ordered