【问题标题】:Extracting a value from inside a django loop从 django 循环中提取值
【发布时间】:2014-08-06 11:32:51
【问题描述】:

我有一个 django 应用程序,我在模板中使用以下内容:

{% load mptt_tags %}
<ul>
    {% recursetree nodes %}
        <li>
            {{ node.name }}
            {% if not node.is_leaf_node %}
                <ul class="children">
                    {{ children }}
                </ul>
            {% endif %}
            {% if node.is_leaf_node %}
                <span ng-bind="progid = {{node.program_id}}"></span> 
            {% endif %}
        </li>
    {% endrecursetree %}
</ul>

一旦递归发生,节点的值将消失。我想知道如何在模板中的这个循环之外提取一个值,以便可以在另一个模板中使用?

我尝试过这样的事情:

<span ng-bind="progid = {{node.program_id}}"></span> 

但是当我在循环之外引用它时,它不起作用!

更新:

如您所见,我正在尝试在循环外使用 progid 的值。

【问题讨论】:

  • 显示所有相关代码。当我们不知道您尝试访问的方式/地点/内容时,我们应该如何知道它是未定义的“在循环之外”?
  • 您可能应该从视图中传递该值。 Django 有with 标签来设置新的模板变量,但是你将如何决定循环的哪个迭代,以及你想要哪个值?可能你也应该在另一个模板中再次循环 nodes
  • @ExpertSystem 我更新了你问的问题:)
  • @Anentropic:实际上我是根据视图过滤模板。因此,我的 node.program_id 在树中始终是相同的值。
  • @crozzfire 是的,但不是每个节点都不一样吗?

标签: django angularjs django-templates


【解决方案1】:

您可以尝试为此编写自定义模板标签。请参阅文档。

https://docs.djangoproject.com/en/dev/howto/custom-template-tags/

假设你的任务标签被命名为assign,那么你会这样做

{% recursetree nodes %}

    {% assign_node node %}

{% endrecursetree %}

然后使用my_node

{{ my_node.program_id }}

您的模板标记代码应该获取上下文。主要上下文始终是 context.dicts[0]。


您的模板标签模块(命名为bar_tags):

from django import template

register = template.Library()

@register.assignment_tag(takes_context=True)
def get_dummy_nodes(context, *args, **kwargs):
    """
    Just get some dummy objects to work with.
    """
    class Node(object):
        name = None
        def __init__(self, program_id):
            self.program_id = program_id

    nodes = []
    for i in range(0, 10):
        nodes.append(Node(i))

    return nodes

@register.simple_tag(takes_context=True)
def assign_node(context, node, *args, **kwargs):
    """
    Puts your variable into the main context under name ``my_node``.
    """
    context.dicts[0]['my_node'] = node
    return ''

您的模板:

<html>
<body>
{% load bar_tags %}

{% get_dummy_nodes as nodes %}

{% for node in nodes %}
    {% assign_node node %}
{% endfor %}

my_node {{ my_node.program_id }}

</body>
</html>

注意:你最好在视图中做这些事情。

【讨论】:

    猜你喜欢
    • 2018-03-05
    • 2019-05-28
    • 2020-05-16
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    • 1970-01-01
    相关资源
    最近更新 更多