显示从数据库中获取的Enum cllass成员名称的值

时间:2019-03-13 14:28:03

标签: python flask enums

我的模型中有这个课程。

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 函数会更好。

3 个答案:

答案 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 代码与路由代码分开。