【问题标题】:Jinja2 template evaluate variable as attributeJinja2模板将变量评估为属性
【发布时间】:2018-07-03 10:42:58
【问题描述】:

我正在为数据库编辑应用程序开发一个 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 %}

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

关于如何使用 jinja2 进行此操作的任何想法,或者如何处理它?我的另一个想法是遍历 python 后端中的当前设置,然后分别传递一个布尔值列表,但这似乎增加了额外的复杂性。

【问题讨论】:

  • 你在哪里通过瞳孔?? capability_list 中有什么?它们是瞳孔的属性吗??
  • 瞳孔是使用 sqlalchemy 创建的类中的对象,通过 views.py 传递,capability_list 是一个列表,其中包含瞳孔对象的属性 - 类似于 ['web_access', 'database_access '] 等。在“长手编码”版本中一切正常,但它正在尝试转换为 Jinja2 for 循环以允许扩展功能列表,而无需重新编码当前卡住的所有内容。

标签: python-3.x jinja2 eval


【解决方案1】:

这是因为您传递的是 字符串 而不是属性。请改用getattr()。做类似getattr(pupil, capability)

【讨论】:

  • 谢谢,我会试一试,等我成功了再报告。
  • 感谢您为我指明了正确的方向 - 因为进一步研究以及其他人对使用 getattr() 的问题,我发现我可以使用 {% if pupil[capability] %} 做我想做的事情来直接访问该属性,无需进一步更改。
猜你喜欢
  • 1970-01-01
  • 2016-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-29
  • 1970-01-01
  • 2015-09-13
  • 1970-01-01
相关资源
最近更新 更多