【问题标题】:Django template language - remove item from a listDjango模板语言 - 从列表中删除项目
【发布时间】:2012-08-24 17:25:10
【问题描述】:

只是一个简单的问题:有没有办法从 Django 模板语言的列表中删除一个项目?

我有一种情况,我正在遍历一个列表,并在另一个列表中打印第一个项目。打印完第一项后,我想将其从该列表中删除。

见下文:

{% for item in list1 %}
     {{list2.0}}
     #remove list2.0 from list2
{% endfor %}

提前致谢。

【问题讨论】:

  • 您是否要遍历列表,不包括某些元素?如果是,您可以随时将if 语句放在for 循环体中。
  • 感谢康拉德,我刚刚编辑了一个示例,说明我正在尝试做的事情
  • 我不会真正将逻辑放入您的模板中。此外,这是您正在显示的 list2 项目,同时遍历 list1;那是对的吗?我认为您可以在模板中使用pop,前提是您的列表确实是一个列表,而不是查询集(否则,在您看来,请使用queryset = list(queryset)。然后,在您的模板中,尝试{{ list2.pop }}。我也不确定你是否可以为 pop 提供一个参数,类似于{{ list2.pop|forloop.counter }}。最后,你可以编写自己的 pop 标签来做到这一点。我可能会想出如果您愿意,可以使用一些代码。
  • 感谢大家的努力,因为建议从 Django 模板语言的列表中删除项目不是一个好主意,我将寻找另一种解决方案,但对于任何人很好奇你确实可以使用 pop 来实现这一目标

标签: python django django-templates


【解决方案1】:

如果您的 list1 和 list2 确实是列表而不是查询集,这似乎可行:

{{ list2 }}  {# show list2 #}
{% for item in list1 %}
    {{ list2.0 }}
    {# remove list2.0 from list2 #}
    {{ list2.pop.0 }}
{% endfor %}
{{ list2 }}  {# empty #}

请注意,pop 在这种情况下不会返回,因此您仍然需要明确地 {{ list2.0 }}。

【讨论】:

  • {{ list2.pop.0 }} 你确定这不会引发像“pop 函数没有 0 属性”这样的错误吗?
  • 对此进行了测试,它确实有效。另请参阅 Ruth 对她的问题的第二条评论。
【解决方案2】:

如果可能的话,我会尝试过滤掉视图中的项目。否则,您可以在 for 循环中添加 if 或 if not 语句。

{% for item in list%}
    {% if item.name != "filterme" %}
        {{ item.name }}
    {% endif %}
{% endfor %}

【讨论】:

    【解决方案3】:

    你不能删除一个项目,但你可以得到没有某个项目的列表(在一个恒定的索引处)

    {% with list2|slice:"1:" as list2 %}
    ...
    {% endwith %}
    

    当然,嵌套规则也适用,等等。

    一般来说,我发现自己在进行复杂的数据结构操作,只需将其移至 Python - 它会更快、更简洁。

    【讨论】:

      【解决方案4】:

      没有这样的内置模板标签。我知道如果list1 不为空,您不想打印list2 的第一项。试试:

      {% for item in list1 %}
           {{list2.0}}
           ...
      {% endfor %}
      
      {% for item in list2 %}
           {% if list1 and forloop.counter == 1 %}
               # probably pass
           {% else %}
               {{ item }}
           {% endif %}
      {% endfor %}
      

      这不是在模板中操作列表内容的好主意。

      【讨论】:

        猜你喜欢
        • 2020-11-07
        • 1970-01-01
        • 2022-12-20
        • 1970-01-01
        • 2020-08-31
        • 1970-01-01
        • 2016-05-08
        • 2011-03-18
        相关资源
        最近更新 更多