【问题标题】:Is there a way to make a django template variable variable into a for loop有没有办法将 django 模板变量变量变成 for 循环
【发布时间】:2020-10-08 13:29:34
【问题描述】:

我的模型中有这个:

tank0 = models.ForeignKey(nb200V1, on_delete=models.SET_NULL, null=True, blank=True, related_name='pmp300Tank0')
tank0MQTT = models.BooleanField(default = False)
tank1 = models.ForeignKey(nb200V1, on_delete=models.SET_NULL, null=True, blank=True, related_name='pmp300Tank1')
tank1MQTT = models.BooleanField(default = False)
tank2 = models.ForeignKey(nb200V1, on_delete=models.SET_NULL, null=True, blank=True, related_name='pmp300Tank2')
tank2MQTT = models.BooleanField(default = False)
tank3 = models.ForeignKey(nb200V1, on_delete=models.SET_NULL, null=True, blank=True, related_name='pmp300Tank3')
tank3MQTT = models.BooleanField(default = False)
tank4 = models.ForeignKey(nb200V1, on_delete=models.SET_NULL, null=True, blank=True, related_name='pmp300Tank4')
tank4MQTT = models.BooleanField(default = False)
tank5 = models.ForeignKey(nb200V1, on_delete=models.SET_NULL, null=True, blank=True, related_name='pmp300Tank5')
tank5MQTT = models.BooleanField(default = False)
tank6 = models.ForeignKey(nb200V1, on_delete=models.SET_NULL, null=True, blank=True, related_name='pmp300Tank6')
tank6MQTT = models.BooleanField(default = False)

我想在我的模板中创建一个 for 循环来生成 html 并在 for 循环中使用 i 设置变量,如下所示:

{% for i in "0123456" %}
<div class="row" style="margin-top:10px">
    <div class="col-sm-12">
        <div class="card">
            <div class="card-header">
                Tank # {{forloop.counter}}
            </div>
            <div class="card-body">
                <div class="row">
                    <div class="col-lg-2 col-md-3 col-sm-4 align-self-center">
                        <label><b>Serial:</b></label>
                        <a href="#" id="{{obj.serial}}_tank{{i}}">{{obj.tank{{i}}.serial}}</a>
                        <small id="{{obj.tank{{i}}.serial}}_serial_ts" class="form-text text-muted">{{obj.tank{{i}}.timeStamp}}</small>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

{% endfor %}

有没有办法做到这一点?

【问题讨论】:

  • 我认为问题在于建模。这看起来像一个一对多的关系。因此,除了使用一些tank...ForeignKeys,您可能应该让nb200V1 引用模型,这样零个、一个或多个nb200V1s 可以引用该模型。

标签: django django-templates


【解决方案1】:

我同意 @Willem 你应该使用反向外键。

但是如果您确实保留该模型结构,那么添加一个返回字段列表的模型属性怎么样:

@property
def tank_list(self):
   return [
     (getattr(self, f"tank{i}"), getattr(self, f"tank{i}MQTT")
     for i in range(7)
   ]

然后在模板中,您可以遍历该列表。要从每个元组中获取第 0、第 1 个元素,只需执行以下操作:

{% for tank_fields in obj.tank_list %}
  {{ tank_fields.0 }}
  {{ tank_fields.1 }}
{% endfor %}

【讨论】:

    猜你喜欢
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2018-11-17
    • 1970-01-01
    • 2010-12-01
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多