【问题标题】:double regroup in django templatedjango模板中的双重重组
【发布时间】:2011-08-17 06:45:25
【问题描述】:

我有一些来自 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 中使用嵌套的重组语句,仅用于与该循环中的特定源节点和目标节点匹配的测量;但我似乎无法让它工作。有什么建议吗?

【问题讨论】:

  • 这个 JSON 是包含在其他 HTML 中还是单独关闭?
  • 它是一个安静的界面,所以它自己。
  • 最好不要使用模板,而是通过代码来完成。但这不是您具体问题的答案。
  • 同意,但我希望有一种“更简单”的方式......在代码中这样做的问题是我必须重新映射/复制所有数据(例如使用服务)。干杯,

标签: django templates django-templates


【解决方案1】:

我会倾向于在不使用重组的情况下这样做。请记住,重新组合需要您的列表开始排序,我假设您的列表已经在两个级别排序。鉴于此,您可以使用 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 %}
}

【讨论】:

  • 我不能 100% 确定嵌套的 ifchanged 会正常工作。我想知道ifchanged 是否归结为测试自上次渲染节点以来值是否发生变化,而不是自上次循环迭代以来。要测试的边缘情况是验证如果给定源节点的 last 目标节点与列表。如果嵌套的ifchanged 被渲染,那么一切都很好。如果不是,那么要做到这一点可能会有点棘手。
  • 再想一想,如果嵌套的ifchanged 证明有问题,你可以结合regroupifchanged 方法——像现在一样使用regroup,并使用内部循环的ifchanged 方法。
猜你喜欢
  • 1970-01-01
  • 2011-08-16
  • 2013-07-24
  • 2010-11-19
  • 2015-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多