我的模型中有这个课程。
class Size(Enum):
ONE = 1
TWO = 2
这是我的表格。我想为此字段预定义选择,这就是为什么我使用枚举类的原因:
size = SelectField('Shoe size', choices=[(name, member.value) for name, member in ShoeSize.__members__.items()])
当在Jinja模板{{ shoe.size }}
中显示时,存储在数据库中的值为ONE,TWO ......,则显示的是成员名称。如何在Jinja模板中显示成员值?
简而言之,我要显示1
,而不要显示ONE
。该课程的 repr 函数会更好。
答案 0 :(得分:2)
您可以教您有关课程的模板:
from enum import Enum
from jinja2 import Template
class Size(Enum):
ONE = 1
TWO = 2
template = Template('{{ Size[db_value].value }} == {{ db_value }}')
template.globals['Size'] = Size
template.render(db_value='ONE')
编辑: 有人将此标记为重复,我不明白,因为链接的答案无法回答jinja2模板问题
答案 1 :(得分:0)
从 @ booley1012 答案中,我得到了更好的见解。我需要做的就是存储值而不是名称: 因此,我在视图文件中导入了Size类:
from app.models import Size
然后在视图函数中执行保存:
shoe = Shoe(size = Size[form.size.data].value)
答案 2 :(得分:0)
如果 Jinja 收到 Enum 对象,您可以 register a custom Jinja filter 告诉 Jinja 使用 Enum 值 (.value
)。
例如,您有这个 template.html:
<body>
{% for obj in objects %}
{{ obj }}<br>
{% endfor %}
</body>
并且您将 objects
传递给可以包含不同类型的模板,如下所示:
@app.route('/', methods=['GET'])
def index():
objects = get_objects_from_somewhere()
# This returns different data types, maybe multiple enums
# Ex. ['somename', (22, 44, 66), Size.ONE, AnotherEnum.XYZ]
return render_template('template.html', objects=objects)
像这样定义一个 Jinja filter function:
from enum import Enum
@app.template_filter()
def to_string(obj):
if isinstance(obj, Enum):
return obj.value
# For all other types, let Jinja use default behavior
return obj
过滤器函数从模板中的 value
接收 {{ value | filter_name }}
,然后您需要返回 Jinja 将显示的内容。从 Jinja 文档中阅读有关 custom filters here 的更多信息。
然后像这样在你的模板中使用它:
<!doctype html>
<body>
{% for obj in objects %}
{{ obj | to_string }}<br>
{% endfor %}
</body>
通过这种方式,您可以处理不同的类型以及跨不同模板重复使用过滤器。它还将视图/UI 代码与路由代码分开。