如何动态切换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 函数的位置:
我目前正在制作一个显示用户交易列表的网络应用程序。我想进行设置以将货币从美元更改为欧元。我在神社中使用自定义过滤器:
我的自定义过滤器和功能:
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 函数的位置: