Jinja2 模板评估变量作为属性
Jinja2 template evaluate variable as attribute
我有一个 Jinja2 模板,我正在为数据库编辑应用程序开发,我正在尝试制作它 'extendible' - 我正在传递一个列表,而不是对编辑页面进行硬编码table 中我想要的属性,并使用 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_access
和 pupil.database_access
等,遵循正在迭代的功能列表.
关于如何使它与 jinja2 一起工作的任何想法,或者可以如何处理它?我的另一个想法是遍历 python 后端中的当前设置,然后分别传递一个布尔值列表,但这似乎增加了额外的复杂性。
这是因为您传递的是 字符串 而不是属性。请改用 getattr()
。做一些像 getattr(pupil, capability)
我有一个 Jinja2 模板,我正在为数据库编辑应用程序开发,我正在尝试制作它 'extendible' - 我正在传递一个列表,而不是对编辑页面进行硬编码table 中我想要的属性,并使用 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_access
和 pupil.database_access
等,遵循正在迭代的功能列表.
关于如何使它与 jinja2 一起工作的任何想法,或者可以如何处理它?我的另一个想法是遍历 python 后端中的当前设置,然后分别传递一个布尔值列表,但这似乎增加了额外的复杂性。
这是因为您传递的是 字符串 而不是属性。请改用 getattr()
。做一些像 getattr(pupil, capability)