Jinja2模板将变量作为属性进行评估

3

我正在为一个数据库编辑应用程序编写 Jinja2 模板,并尝试使它“可扩展” - 而不是硬编码编辑页面,我传递了一个属性列表以便在表格中显示,然后使用 for 循环来迭代它们。除了一个问题以外,它运行得很好 - 在硬编码版本中,我使用传递的对象的属性来查看该值是否已设置(它们都是布尔值),但我不知道如何让 jinja2 接受 'capability' 并将其作为 'pupil' 对象的属性使用;我本来会在 Python 中使用 'eval',但不知道如何让它工作。以下是代码示例:

{%  for capability in capability_list %}
    <tr>
        <td>{{ capability }}</td>
        <td>
            {% if pupil.capability %}
                <img src="{{request.static_url('gdpr_permissions:static/tick.png')}}" width="25">
            {% else %}
                <img src="{{request.static_url('gdpr_permissions:static/cross.png')}}" width="25">
            {% endif %}
        </td>
        <td>
            <div class="onoffswitch">
                <input type="checkbox" name="{{ capability }}" class="onoffswitch-checkbox" value ='No' id="{{ capability }}" checked>
                    <label class="onoffswitch-label" for="{{ capability }}">
                    <span class="onoffswitch-inner"></span>
                    <span class="onoffswitch-switch"></span>
                    </label>
            </div>
        </td>
    </tr>
    {% endfor %}

问题出在这里:{% if pupil.capability %},我希望按照正在迭代的能力列表来改写它,比如改成pupil.web_accesspupil.database_access等。

你有什么想法可使这在jinja2上起作用或者采用其他方法来解决?另一个想法是迭代当前Python后台中的设置,然后分别传递布尔值列表,但这样似乎会增加额外的复杂性。


你在哪里传递 pupil 参数?capability_list 中有什么内容?它们是 pupil 的属性吗? - E_K
学生是一个使用SQLAlchemy创建的类中的对象,通过views.py传递,capability_list是一个列表,其中包含学生对象的属性 - 类似于['web_access','database_access']等。在“长手编码”版本中,一切都正常工作,但尝试将其转换为Jinja2 for循环以允许扩展能力列表而无需重新编码所有内容,这就是目前卡住的地方。 - djaychela
1个回答

5
这是因为您传入了一个字符串而不是属性。使用getattr()替代。像这样做:getattr(pupil, capability)

谢谢,我会尝试并在成功后回报。 - djaychela
1
谢谢您指引我正确的方向——通过进一步查找和其他人关于使用getattr()的问题,我发现可以使用{% if pupil[capability] %}直接访问属性,无需进行任何其他更改,从而达到了我想要的效果。 - djaychela

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接