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

时间:2015-05-29 19:56:32

标签: python unicode flask jinja2

我正在部署Stripe,它要求传入其中的付款值以“美分”而非美元表示。我可以在后端处理这个问题(即我可以处理适当金额的付款)但是为了在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问题,只是不确定如何解决它

1 个答案:

答案 0 :(得分:1)

您可以先转换数字:

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

或者也许:

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