如何动态切换jinja过滤器

How to dynamically switch jinja filter

我目前正在制作一个显示用户交易列表的网络应用程序。我想进行设置以将货币从美元更改为欧元。我在神社中使用自定义过滤器:

我的自定义过滤器和功能:

from forex_python.converter import CurrencyRates
from babel.numbers import format_currency

c = CurrencyRates()

# Format and convert transaction amount in EUR
def to_euros(value):
    value = c.convert('USD', 'EUR', value)
    return format_currency(value, 'EUR', locale='en_US')
app.jinja_env.filters['to_euros'] = to_euros

# Format transaction amount in USD
def to_usd(value):
    value = c.convert('USD', 'USD', value)
    return format_currency(value, 'USD', locale='en_US')
app.jinja_env.filters['to_usd'] = to_usd

我的routes.py:

@app.route("/history", methods=['GET', 'POST'])
@login_required
def history():
    # Getting all transactions linked to user id
    row = Transactions.query.filter_by(user_id=current_user.id).order_by(Transactions.date.desc())
    return rnd_tmp("history.html", rows=row)

在我的 html 文件中:

{% extends "layout.html" %}

{% block title%}
    History
{% endblock %}

{% block main %}
    <div id="body-main">
        <table class="table table-striped table-full">
            <thead>
                <th>Date</th>
                <th>Type</th>
                <th>Category</th>
                <th>Amount</th>
                <th>Notes</th>
            </thead>
            <tbody>
                {% for row in rows %}
                    <tr>
                        <td>{{ row['date'] }}</td>
                        <td>{{ row['type'] }}</td>
                        <td>{{ row['category'] }}</td>
                        <td>{{ row['amount'] | to_usd }}</td>
                        <td>{{ row['notes'] }}</td>
                    </tr>
                {% endfor %}
            </tbody>
        </table>
    </div>
{% endblock %}

我想创建一个新路由,其中​​有一个 select 选项可以在美元和欧元货币之间转换,因此从 <td>{{ row['amount'] | to_usd }}</td> 更改为 <td>{{ row['amount'] | to_euros }}</td>。 我怎样才能使用 Flask 动态地做到这一点?

Jinja 过滤器可以接受参数 - 参见 documentation。这意味着您可以编写一个更通用的 to_currency 过滤器,将所选货币作为参数。

例如:

def to_currency(value, code):
    value = c.convert('USD', code, value)
    return format_currency(value, code, locale='en_US')

app.jinja_env.filters['to_currency'] = to_currency

您可以在 Jinja 模板中按以下方式使用它:

<td>{{ row['amount'] | to_currency(selected_currency) }}</td>

字符串值 selected_currency 将从路由传入 'USD''EUR'

请参见下图,其中显示了过滤器 'the value' 左侧与过滤器参数一起传递到 Python 函数的位置: