django 和模板中的多对多关系

many to many relationship in django and templates

我有三个模型:Zone、Stage 和 ZoneStage,具有多对多关系。

背后的重点是我有多个区域,每个区域都有多个阶段。对于每个阶段的每个区域,我想显示特定的值,这就是我创建 ZoneStage 模型的原因。

我不知道如何按照下面的图片显示值。我以为我可以通过以下方式做到这一点:

例如 对于区域中的 objectz: 对于舞台上的物体: 对于 zone_stage 中的对象:

还有一些条件

例如 尝试使用过滤器?

尽管如此,我需要一些指导和方向来阅读哪些内容、如何阅读等等,如果有任何反馈可以帮助我更轻松地解决这个问题,我将不胜感激。

这是我得到的:

我的模特:

class Zone(models.Model):
    ZONE_N = (
        ('Z2','Z2'),
        ('Z4','Z4'),
        ('Z6.1','Z6.1'),
        ('Z9LH','Z9LH'),
        )
    zone_name = models.CharField(max_length=5, choices=ZONE_N, primary_key=True)
    zone_number = models.CharField(max_length=5,blank=True)


    class Meta:
        ordering = ('zone_name',)      

    def __unicode__(self):
        return self.zone_name    

class Stage(models.Model):
    STAGE_N = (
        ('S1','S1'),
        ('S2','S2'),
        ('S3','S3'),
        ('S4','S4'),
        )    
    stage_number = models.CharField(max_length=3, choices=STAGE_N, primary_key=True)
    stage_name = models.CharField(max_length=50)
    zones = models.ManyToManyField('Zone', through='ZoneStage', related_name='status')

    class Meta:
        ordering = ('stage_number',)      

    def __unicode__(self):
        return self.stage_number       

class ZoneStage(models.Model):
    zone = models.ForeignKey(Zone)
    stage = models.ForeignKey(Stage)
    value = models.CharField(max_length=10)

    class Meta:
        ordering = ('zone',)          

    def __unicode__(self):
        return '%s %s' % (self.zone, self.stage)

我的观点:

def index(request):
    zs = ZoneStage.objects.all()
    z = Zone.objects.all()
    s = Stage.objects.all()
    context = {'zone_stage': zs, 'zone': z, 'stage': s}

    return render(request, 'index.html', context)

我的模板:

<table border="1">
<tr>
    <td></td>
    <td></td>

    {% for object in zone %}
    <td>{{ object.zone_name }}</td>
    {% endfor %}
</tr>

{% for stages in stage %}
<tr>
<td>{{ stages.stage_number }}</td>
<td>{{ stages.stage_name }}</td>
        {% for values in stages.zonestage_set.all|dictsort:"zone.zone_name" %}
        <td>{{ values.value}}</td>
        {% endfor %}
</tr>
{% endfor %}
</table>

由于您的 ZoneStageintermediate 模型,因此 zoneidstageid 应该是 ForeignKey,而不是 ManyToMany。请参阅此处的示例:

https://docs.djangoproject.com/en/1.8/topics/db/models/#intermediary-manytomany

如果你看看你的结构,你会发现它是有道理的。由于您的 ZoneStage 是交点,因此它们不能是多对多。每个 ZoneStage 将有一个独特的 Zone 和一个独特的 Stage.

完成后,您可以通过这种方式访问​​值,例如:

<table border="1">
<tr>
    <td></td>
    <td>{{ object.zone }}</td>
    {% for object in zone|dicsort:"zone_name" %}
        <td>{{ object.zone_name }}</td>
    {% endfor %}
    </tr>
{% for objectS in stage %}
    <tr>
        <td>{{ objectS.stage_no }}</td>
        <td>{{ objectS.stage_name }}</td>
            {% for zonestages in objectS.zonestage_set.all|dictsort:"zoneid.zone_name" %}
                <td>{{ zonestages.zonestage}}</td>
            {% endfor %}
    </tr>
{% endfor %}
</table>

编辑:

如果每个交叉点都有一个值,则以前的解决方案有效。如果不是另一种方法,那就是这样的:

<table border="1">
    <tr>
        <td></td>
        <td>{{ object.zone }}</td>
        {% for object in zone|dicsort:"zone_name" %}
            <td>{{ object.zone_name }}</td>
        {% endfor %}
        </tr>
    {% for objectS in stage %}
        <tr>
            <td>{{ objectS.stage_no }}</td>
            <td>{{ objectS.stage_name }}</td>
                {% for zones in zone|dicsort:"zone_name" %}
                    <td>
                    {% for zonestages in objectS.zonestage_set.all %}
                    {% if zonestages.zone == zones %} {{ zonestages.zonestage}}{% endif %}
                    {% endfor %}
                    </td>
                {% endfor %}
        </tr>
    {% endfor %}
    </table>