【问题标题】:How replace None with empty string in Tornado template如何在 Tornado 模板中用空字符串替换 None
【发布时间】:2022-01-03 14:57:28
【问题描述】:

我有一些来自 SQL-Alchemy 的模型传递给 generate 函数:

from tornado import template
loader = template.Loader('.')
template = loader.load('index.html')
content = template.generate(user=user)

index.html:

<div>Name:<span>{{ user.first_name }} {{ user.last_name }} </span></div>

我的问题是在用户对象中为空值显示None。如果对象和字段的数量很少,我可以为每个变量使用or ''

    <div>Name:<span>{{ user.first_name or ''}} {{ user.last_name or ''}} </span></div>

但在某些 HTML 文件中,6 个对象中包含 40 多个字段。我正在寻找一种方法来告诉模板引擎将所有空值替换为 ''

【问题讨论】:

    标签: templates tornado nonetype


    【解决方案1】:

    没有办法告诉模板引擎用空字符串替换每个None 值。我认为其他模板引擎也没有这个功能。

    我的方法是使用 for 循环显示字段:

    处理程序:

    class MyHandler(...):
        fields = [field.name for field in user.__table__.columns]
        content = template.generate(user=user, fields=fields)
    

    模板:

    {% for field in fields %}
        {{ getattr(user, field) or '' }}
    {% end %}
    

    奖励答案

    在我的项目中,我创建了一个实用程序函数来处理变量在模板中的显示方式,例如将None 转换为'' 或格式化datetime 对象,或者调用可调用的变量。

    def get_value(variable):
        if variable == None:
            return ''
        elif isinstance(variable, datetime):
            return variable.strftime("%d/%m/%y")
        elif callable(variable):
            return get_value(variable())
        # more conditions ...
        # such as replace True/False booleans with Yes/No 
    

    然后将此函数从您的基本处理程序的 get_template_namespace 函数传递给模板。

    最后,在模板中,为每个变量调用这个函数:

    {% for field in fields %}
        {{ get_value(getattr(user, field)) }}
    {% end %}
    

    如果一个字段返回一个日期,get_value将格式化它,如果该字段返回None,它将替换为'',如果该字段是一个可调用的方法,它将被调用。

    【讨论】:

    • 谢谢。我更喜欢奖励答案!
    猜你喜欢
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 2014-07-23
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多