Jinja2 模板将变量评估为属性

dja*_*ela 4 eval jinja2 python-3.x

我正在为数据库编辑应用程序开发一个 Jinja2 模板,并且我正在尝试使其“可扩展” - 而不是对编辑页面进行硬编码,我正在传递我想要的属性列表表,并使用 for 循环来迭代它们。它的工作原理除了一件事之外 - 在硬编码版本中,我使用正在传递的对象的属性来查看该值是否已设置(它们都是布尔值),但我不知道如何让 jinja2 接受“能力”并将其用作“学生”对象的属性;我会在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 %}
Run Code Online (Sandbox Code Playgroud)

这是{% if pupil.capability %}不起作用的部分 - 我希望它成为(比如说)pupil.web_accesspupil.database_access,遵循正在迭代的功能列表。

关于如何让它与 jinja2 一起工作有什么想法,或者还有其他方法可以实现吗?我的另一个想法是迭代 python 后端中的当前设置,然后单独传递布尔值列表,但这似乎增加了额外的复杂性。

Esi*_*ngs 5

这是因为您传递的是字符串而不是属性。getattr()代替使用。做类似的事情getattr(pupil, capability)