如何使用模板内具有多个一对多关系的 Django 模型执行嵌套循环

问题描述 投票:0回答:1

我正在 Django 中闲逛,以了解该框架并拥有一个数据库模式来对高尔夫球场数据进行建模。我正在尝试组合一个简单的视图来查看特定高尔夫球场的球洞信息。高尔夫球场有 1 个或多个赛道,其中包含 1 个或多个发球台,每个发球台有 18 个洞,具有各种属性(洞数、标准杆、码数等)。我想为特定高尔夫球场中包含的每个赛道组织的所有发球台设置一个简单的 HTML 表格格式。 我无法弄清楚如何在模板中构建循环来以这种方式格式化数据。

这是我的模型:

class GolfCourse(models.Model):
    """
    This class models the Golf Course Table
    """
    name = models.CharField(max_length=200)
    address = models.CharField(max_length=200)
    city = models.CharField(max_length=50)
    state = models.CharField(max_length=50)
    zipcode = models.CharField(max_length=10)


class Track(models.Model):
    """
    This class models a Track within a golf course
    """
    course_id = models.ForeignKey(GolfCourse, on_delete=models.CASCADE)
    name = models.CharField(max_length=100)


class Tees(models.Model):
    """
    This class models a set of Tee markers on a Track
    """
    track_id = models.ForeignKey(Track, on_delete=models.CASCADE)
    name = models.CharField(max_length=50)
    rating = models.FloatField()
    slope = models.FloatField()


class HoleInfo(models.Model):
    """
    This class models the information for a hole associated with a Tee
    """
    tee_id = models.ForeignKey(Tees, on_delete=models.CASCADE)
    hole_number = models.SmallIntegerField()
    par = models.SmallIntegerField()
    handicap = models.SmallIntegerField()
    yardage = models.SmallIntegerField()

这是我的视图函数中的查询:

course_data =  HoleInfo.objects.select_related("tee_id__track_id__course_id").filter(tee_id__track_id__course_id=pk)

我能够弄清楚如何访问相关模型对象中的字段,例如与 HoleInfo 对象关联的 GolfCourse 名称,但我正在努力解决的问题是如何访问模板中的迭代器,以便我可以有一个嵌套循环对于所有轨迹、轨迹中的所有 T 形件以及每个 T 形件的所有 18 个 HoleInfo 对象。

我的模板片段:

...
<h1>{{ course_detail.tee_id.track_id.course_id.name }}</h1>
{% for track in course_detail.??? %}
    {% for tee in ??? %}
        <-- Format all 18 hole objects associated with this tee object into a table -->
    {% endfor %}
{% endfor %}
...
python django django-models django-views django-templates
1个回答
0
投票

在模板中迭代您需要的字段

<h1>{{ course_detail.tee_id.track_id.course_id.name }}</h1>
{% for track in course_detail %}
    
    {{ track.tee_id }}
    {{ track.tee_id.name }}
    {{ track.tee_id.track_id.name }}

{% endfor %}
© www.soinside.com 2019 - 2024. All rights reserved.