【问题标题】:many to many relationship in django and templatesdjango和模板中的多对多关系
【发布时间】:2015-11-16 11:44:07
【问题描述】:

我有三个模型:Zone、Stage 和具有 ManyToMany 关系的 ZoneStage。

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

我不知道如何按照下面的图片显示值。我想我可以通过:

例如 对于区域中的 objectz: 对于舞台中的对象: 对于 zone_stage 中的 objectzs:

这里有一些条件

例如 尝试使用过滤器?

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

这是我得到的:

我的模特:

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>

【问题讨论】:

    标签: django templates models


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

    【讨论】:

    • 嗨,我已经根据上面第一篇文章中的更新代码更改了我的代码,并按照您的建议使用 dictsort,但仍然不显示值...
    • 要使用'_set',你需要使用模型名称。所以应该是:{% for values in stages.zonestage_set.all|dictsort:"zone.zone_name" %}。除此之外,我认为它应该可以工作,但如果没有看到数据,这有点难以判断。你的桌子的其余部分都显示了吗?
    • 朱利安,感谢您的建议。您的回答首先为我指明了正确的方向,现在您的进一步建议使我可以看到值,尽管我没有按预期显示它们。我会在一秒钟内发布一张图片。
    • 我现在明白了,我需要添加 {% if %} 语句来测试一些条件,如果该区域有 ZoneStage,则该舞台显示值 {% else %} 显示例如 None。跨度>
    • 查看编辑我添加了一个关于如何计算表格的示例。也许不是最有效的,但它应该给你一个想法。
    猜你喜欢
    • 2013-11-05
    • 2011-12-08
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 2018-01-04
    • 2014-05-20
    • 2013-07-16
    • 2021-02-23
    相关资源
    最近更新 更多