django和模板中的多对多关系

时间:2015-08-22 17:16:52

标签: django templates models

我有三个模型:Zone,Stage和ZoneStage以及ManyToMany关系。

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

我不知道如何根据下面的图片显示值。我以为我可以通过以下方式做到:

e.g。 对于区域中的objectz:  对于阶段中的对象:    对于zone_stage中的objectzs:

这里有一些条件

e.g。 试试过滤器?

虽然,我需要一些指导和指导,阅读有关内容,如何做等等,如果有任何反馈可以让我的生活更容易解决这个问题,我将不胜感激。

这就是我得到的:

enter image description here

我的模特:

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>

1 个答案:

答案 0 :(得分:1)

由于您的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>