将上下文处理器与 Jinja 模板变量结合使用

Using a context processor in conjunction with Jinja template variables

我正在部署 Stripe,它要求传递给它的付款值以 "cents" 而非美元表示。我可以在后端处理这个(即我可以处理适当金额的付款)但为了在 Stripe 的 UI 中正确呈现,我必须将价格转换为美分。 ($400 变成 40000 美分)

我正在尝试使用上下文处理器将我存储在数据库中的美元价格转换为美元,我可以使用 views.py 文件中的以下代码成功完成此操作:

@buy_blueprint.context_processor
def utility_processor():
  def format_price(amount):
    return u'{0:.0f}'.format(amount)
  return dict(format_price=format_price)

并将以下内容插入到我的 template.html 文件中

Course Price: {{ format_price(40000) }}

呈现为 40000 - 完美。

但我想做的是:

{% for course in courses %}
<p> Course Name: {{ course.course_name }} Course Price: {{ course.price }} Max Number of Students: {{ course.max_number_students}}   Remaining Space: {{ course.spaces_left }}
{% if course.spaces_left > 0 %}
<form action="{{ url_for('buy.buy')}}" method="POST">
 <script src="https://checkout.stripe.com/checkout.js" class="stripe-button"
  data-key={{key}}
  data-amount= {{ format_price(course.price)}}
  data-name="Super teacher"
  data-label="Great  Dancing"
  data-description="Learn to Dance">
 </script>
 {% else %}
 <p>No more space</p>
 {% endif %}
<input type="hidden" name="course_id" value="{{course.id}}" />
</form>

但问题是:

data-amount= {{ format_price(course.price)}}

抛出以下错误:

 File "/Users/workhorse/flask-intro/project/buy/views.py", line 92, in format_price

    return u'{0:.0f}'.format(amount)

    ValueError: Unknown format code 'f' for object of type 'unicode'

我知道这是 unicode 问题,只是不确定如何修复它

您可以先转换数字:

def format_price(amount):
    return u'{0:.0f}'.format(int(amount))

或者也许:

def format_price(amount):
    return u'{0:.0f}'.format(100*int(amount))