django模板中的双重重组

时间:2011-05-02 21:15:08

标签: django templates django-templates

我有一些django视图的输出需要一些排序。我希望我可以在模板中而不是在代码中执行此操作:

基本上,我需要表示一个节点/边图;但是,两个节点之间可能有很多边缘(有向) - 因此我想在它们之间创建唯一的id,这样我的json就不会被覆盖('measurement1'和'measurement2'):

nodes: { 
  nodeA: {},
  nodeB: {}
},
edges: {
  nodeA: { 
    nodeB: { 
      measurement1: {},
      measurement2: {}
    }
  }
}

所以我的模型基本上是这样的:

class Measurement( models.Model ):
  service = models.ForeignKey( Service, db_index=True )
  source_node = models.ForeignKey( Node, related_name='source' )
  target_node = models.ForeignKey( Node, related_name='target' )

问题是我的模板目前看起来像这样(它会覆盖json:

"nodes": <blah>
"edges": {
  {% regroup measurements by source_node_id as source_list %}
  {% for source in source_list %}
  "{{ source.grouper }}": {
    {% for item in source.list %}
      "{{ item.target_node_id }}": { 
        "id": "{{ item.id }}",
        "service_type": "{{ item.service.service_type|lower }}" }{% if not forloop.last %},{% endif %}
    {% endfor %}
  }{% if not forloop.last %},{% endif %}
  {% endfor %}
}

在术语中给出了类似的东西:

edges: {
  nodeA: {
    nodeB: {
      id: measurement1,
      service_type: service1
    },
    nodeB: {
      id: measurement2,
      service_type: service2
    }
}

所以基本上,我需要for item in source.list内的嵌套regroup语句,只需要与该循环中的特定源节点和目标节点匹配的测量值;但我似乎无法让它发挥作用。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我倾向于在不使用重组的情况下这样做。请记住,重新组合需要先订购您的列表,我假设您的列表已在两个级别订购。鉴于此,您可以使用ifchanged执行类似以下操作,以跟踪自上一次循环迭代以来源和/或目标节点是否已更改。你可能想要修剪一些空格以产生更漂亮的输出:

edges: {
{% for meas in measurements %}
  {% ifchanged meas.source_node_id %}
    {% if not forloop.first %}
        }
      },
    {% endif %}
    {{ meas.source_node_id }}: {
      {{ meas.target_node_id }}: {
  {% else %}
    {% ifchanged meas.target_node_id %}
      },
      {{ meas.target_node_id }}: {
    {% else %}
      ,
    {% endifchanged %}
  {% endifchanged %}
  measurement{{ meas.id }}: { }
  {% if forloop.last %}
    }
  }
  {% endif %}
{% endfor %}
}