Django 模板:如何访问等于变量值的表单字段?

And*_*bak 4 django django-templates

想象一下以下用例:我有一个报告模板字典。每个报告模板都有一个 ID 和一个名称。它看起来或多或少是这样的:

reports = [ { 'ID' : 'A1',
              'NAME' : 'special report 1 for department A',
              ... (other fields irrelevant to the question's matter)
            },
            { 'ID' : 'X9',
              'NAME' : 'special report 9 for department X',
              ... (other fields irrelevant to the question's matter)
            },
          ]
Run Code Online (Sandbox Code Playgroud)

报告的访问和可见性将存储在数据库中。
我创建了一个字段名称等于报告 ID 的表单。一切都很好,直到我必须在模板中显示表单。我不知道如何访问正确的表单字段。此语法不起作用:

{% for report in reports %}
<tr>
    <td>{{ report.ID }}</td>
    <td>{{ report.NAME }}</td>

    <td>{{ form.report.ID }}</td>

</tr>
{% endfor %} 
Run Code Online (Sandbox Code Playgroud)

还:

{% for report in reports %}
<tr>
    <td>{{ report.ID }}</td>
    <td>{{ report.NAME }}</td>
    {% with report.ID as key %}     
    <td>{{ form.key }}</td>
    {% endwith %}
</tr>
{% endfor %} 
Run Code Online (Sandbox Code Playgroud)

不起作用。

语法应该如何?下面的代码中应该放什么来代替问号?

{% for report in reports %}
<tr>
    <td>{{ report.ID }}</td>
    <td>{{ report.NAME }}</td>

    <td>{{ form.??? }}</td>

</tr>
{% endfor %} 
Run Code Online (Sandbox Code Playgroud)

我越过了这个解决方案:Django Templates: Form field name as variable? 如果没有任何其他方法可以解决我的问题,我想我将不得不使用它。

Sky*_*and 5

不鼓励这样做,因为模板应该尽可能没有逻辑。但是,在实践中,这种情况一直出现。您可以制作一个执行此操作的模板过滤器:

@register.filter(name='get')
def get(o, index):
    try:
        return o[index]
    except:
        return settings.TEMPLATE_STRING_IF_INVALID
Run Code Online (Sandbox Code Playgroud)

然后,在模板中,在适当地加载 templatetags 库之后:

{% for report in reports %}
<tr>
    ...
    <td>{{ form|get:report.ID }}</td>
</tr>
{% endfor %} 
Run Code Online (Sandbox Code Playgroud)