【问题标题】:Django template filters 2 ManytoMany fieldsDjango模板过滤2个多对多字段
【发布时间】: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

等等

目前我得到:

男子轻量级

女子轻量级

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

【问题讨论】:

    标签: python django django-templates django-orm


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2018-06-07
      • 2015-07-18
      • 1970-01-01
      • 2018-04-12
      • 2020-03-20
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 2011-12-08
      相关资源
      最近更新 更多