django 模板通过 forloop.counter 访问列表项

Posted

技术标签:

【中文标题】django 模板通过 forloop.counter 访问列表项【英文标题】:django template access to list item by forloop.counter 【发布时间】:2019-04-16 15:23:40 【问题描述】:

我想在 Django 模板中循环我的模型查询集。我可以简单地使用 Django for loop 做到这一点,但我不能超过 1 步,这是我的代码

 % for map in maps %

 % if  forloop.counter|divisibleby:2 %

   #Here I can access Maps with index of 1,3,5 and ..
   #How can I access map with index 2,4,6 here at the same time sth like Map[forloop.counter+1]

 % endif %


 % endfor %

事实上,我想要一种在我的模板中访问 Map[forloop.counter+1] 的方法,但我不知道该怎么做

【问题讨论】:

使用% else % ? 不,我不能使用 else,因为我想为 +2 加步 【参考方案1】:

创建此处定义的自定义模板过滤器https://docs.djangoproject.com/en/dev/howto/custom-template-tags/#registering-custom-filters

from django import template
register = template.Library()
@register.filter
def list_item(lst, i):
    try:
        return lst[i]
    except:
        return None

在你的模板中,像这样使用它:

% for map in maps %

 % if  forloop.counter|divisibleby:2 %

 % with maps|list_item:forloop.counter+1 as another_map %

 another_map.id

 % endif %

% endfor %

在哪里写模板标签? 创建与models.pyviews.py同级的目录templatetags。然后添加__init__.py 和一个文件maps_tags.py。在maps_tags.py 中写入自定义标签定义。在您的模板中,通过在顶部写入 % load maps_tags % 来加载模板标签。更多文档https://docs.djangoproject.com/en/dev/howto/custom-template-tags/#code-layout

【讨论】:

嗨,非常感谢,我怎样才能设法从地图中获取信息?例如 maps|list_item:forloop.counter+1 .id 可以吗? @MajidHojati 你必须使用with。更新了我的答案。【参考方案2】:

您可以组合多个 forloop 并为此实现自定义逻辑,但不能同时访问。下面是 Django 2.1 文档中的所有 forloops。

forloop.counter     The current iteration of the loop (1-indexed)
forloop.counter0    The current iteration of the loop (0-indexed)
forloop.revcounter  The number of iterations from the end of the loop (1-indexed)
forloop.revcounter0     The number of iterations from the end of the loop (0-indexed)
forloop.first   True if this is the first time through the loop
forloop.last    True if this is the last time through the loop
forloop.parentloop  For nested loops, this is the loop surrounding the current one

告诉我,你想解决什么问题?也许您可以创建自定义模板标签或模板过滤器。

【讨论】:

但是我怎样才能访问maps[forloop.counter ]?我的问题是通过forloop.counter index 访问地图【参考方案3】:

在 Django 中,您可以使用 forloop.counter 索引从 1 开始或 forloop.counter0 索引从 0 开始。

也许你可以用它来访问索引+1

我希望这会有所帮助。你可以阅读更多here

【讨论】:

但是我怎样才能访问maps[forloop.counter ]

以上是关于django 模板通过 forloop.counter 访问列表项的主要内容,如果未能解决你的问题,请参考以下文章

Django 模板:通过扩展模板覆盖包含的子模板块

通过Django模板检测模板中使用的语言[关闭]

Django 模板 - 通过字符串参数重新组合

通过 Django 模板中的视图传递变量

django 模板通过 forloop.counter 访问列表项

Django:在部署时通过模板引擎渲染静态文件