如何在Django模板中使用变量索引访问列表?

tam*_*are 10 django django-templates

说,我有两个对象列表,foobar.在Django模板中,循环时foo,有一个计数器跟踪当前索引/迭代,计数器用于访问bar.这里的问题是我不认为Django模板系统支持使用变量索引访问列表.真的吗?如果是这样,问题是否有任何解决方法(除了用硬编码索引重复相同的html /模板代码)?

代码演示:

{% for x in foo %}
  <span>{{ x.name }} vs. {{ bar.{{ forloop.counter0 }}.name }}</span>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

Django模板不喜欢 {{ bar.{{ forloop.counter0 }}.name }}

注意:我使用的是Django 1.4

acj*_*jay 10

你是正确的Django模板不直接允许这样做,这是因为Django试图强迫你在你的视图中放置几乎所有的表示逻辑.您最好的选择是在视图中创建上下文中的dicts列表,这样您就可以迭代它并按名称访问成员.要么:

  • zip你的名单在一起,而不是让他们成为一个词典并使用它们访问它们{% for fooItem, barItem in zippedList %}.
  • 使用限制较少的模板语言,如Jinja2
  • 使用Yuji Tomita建议的自定义模板过滤器


Yuj*_*ita 5

是的,你无法解析变量名.绝对要非常努力地将这个逻辑放在视图中.

但有5%的时间,我确实发现这极其有限,有时需要在模板作者控制之外的视图/更改中需要太多逻辑.我接受了一些个人定制,允许在视图中进行变量赋值以及简单的变量分辨率.

尽管如此,使用模板引擎"所有查找在一个"系统(索引,属性,键)中构建模板标签非常简单.

from django.template import Variable, VariableDoesNotExist

@register.assignment_tag()
def resolve(lookup, target):
    try:
        return Variable(lookup).resolve(target)
    except VariableDoesNotExist:
        return None

{% resolve some_list some_index as value %}
{% resolve some_dict some_dict_key as value %}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢Patrick.许多答案不是完整的代码答案,而是想法,伪代码等等,所以这是一个相当苛刻的等级.更新. (2认同)