python - 如何在 Flaks wtform DecimalField 上设置 use_locale?
问题描述
我一直在尝试为 wtform DecimalField 设置“use_locale”参数,但似乎没有任何效果,而且几乎没有任何关于如何设置“use_locale”的示例。我已经阅读了 Babel 和 WTForm DecimalField 的文档,但到目前为止我一无所获。
这是相关的代码片段:
初始化.py:
from flask import Flask, request
from config import Config
from flask_babel import Babel, Locale
app = Flask(__name__)
app.config.from_object(Config)
babel = Babel(app)
locale = Locale('pt', 'BR')
表格.py:
from flask_wtf import FlaskForm
from app import app, db, locale
from wtforms import StringField, BooleanField, SubmitField, TextAreaField, IntegerField, SelectField, DecimalField
from wtforms.validators import ValidationError, DataRequired, EqualTo, Length
class Alterar(FlaskForm):
valor = DecimalField('ValorTotal', validators=[DataRequired(),Length(min = 1)], use_locale = True)
路线.py
from flask import render_template, flash, redirect, url_for, request
from app import app, db
from app.forms import Alterar
from app.models import Orders
@app.route('/v_info/<id_order>', methods=['GET, POST'])
def v_info(id_order):
table = db.session.query(Orders).filter(Orders.id_ord == id_order).first()
form = Alterar(request.form, obj=table)
return render_template('v_info.html', data = table, form = form)
最后,我得到的错误是:
Traceback (most recent call last):
File "c:\anaconda3\lib\site-packages\flask\app.py", line 2447, in wsgi_app
response = self.full_dispatch_request()
File "c:\anaconda3\lib\site-packages\flask\app.py", line 1952, in full_dispatch_request
rv = self.handle_user_exception(e)
File "c:\anaconda3\lib\site-packages\flask\app.py", line 1821, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "c:\anaconda3\lib\site-packages\flask\_compat.py", line 39, in reraise
raise value
File "c:\anaconda3\lib\site-packages\flask\app.py", line 1950, in full_dispatch_request
rv = self.dispatch_request()
File "c:\anaconda3\lib\site-packages\flask\app.py", line 1936, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "C:\Users\MS\websiteProject\app\routes.py", line 78, in v_info
form = Alterar(request.form, obj=table)
File "c:\anaconda3\lib\site-packages\wtforms\form.py", line 208, in __call__
return type.__call__(cls, *args, **kwargs)
File "c:\anaconda3\lib\site-packages\flask_wtf\form.py", line 87, in __init__
super(FlaskForm, self).__init__(formdata=formdata, **kwargs)
File "c:\anaconda3\lib\site-packages\wtforms\form.py", line 268, in __init__
super(Form, self).__init__(self._unbound_fields, meta=meta_obj, prefix=prefix)
File "c:\anaconda3\lib\site-packages\wtforms\form.py", line 51, in __init__
field = meta.bind_field(self, unbound_field, options)
File "c:\anaconda3\lib\site-packages\wtforms\meta.py", line 27, in bind_field
return unbound_field.bind(form=form, **options)
File "c:\anaconda3\lib\site-packages\wtforms\fields\core.py", line 376, in bind
return self.field_class(*self.args, **kw)
File "c:\anaconda3\lib\site-packages\wtforms\fields\core.py", line 663, in __init__
super(DecimalField, self).__init__(label, validators, **kwargs)
File "c:\anaconda3\lib\site-packages\wtforms\fields\core.py", line 588, in __init__
self.locale = kwargs['_form'].meta.locales[0]
TypeError: 'bool' object is not subscriptable
127.0.0.1 - - [26/Sep/2020 07:42:48] "[35m[1mGET /v_info/1234 HTTP/1.1[0m" 500 -
我知道 bool 对象不可下标,但是,我应该在“use_locale”参数中传递什么?文档中有关课程的详细信息:
class wtforms.fields.DecimalField(default field arguments, places=2, rounding=None, use_locale=False, number_format=None)[source]¶
A text field which displays and coerces data of the decimal.Decimal type.
Parameters
places – How many decimal places to quantize the value to for display on form. If None, does not quantize value.
rounding – How to round the value during quantize, for example decimal.ROUND_UP. If unset, uses the rounding value from the current thread’s context.
use_locale – If True, use locale-based number formatting. Locale-based number formatting requires the ‘babel’ package.
number_format – Optional number format for locale. If omitted, use the default decimal format for the locale.
解决方案
如果您只想查看格式化的值,您可以定义一个过滤器并将其应用于模板:
from babel.numbers import format_decimal
def FormatDecimal(value):
return format_decimal(value, locale='de_DE')
jinja2.filters.FILTERS['FormatDecimal'] = FormatDecimal
{{ decimal_value | FormatDecimal }}
如果您想将其添加到输入字段,也许您可以尝试使用过滤器(不确定是否有效):
DecimalField('ValorTotal', validators=[DataRequired(),Length(min = 1)], filters=[lambda x: format_decimal(x, locale='de_DE')])
推荐阅读
- python - 在 scikit-learn 的 .fit() 方法中使用什么优化算法?
- jenkins - Jenkins:Groovy:不允许使用方法 groovy.lang.GroovyObject getProperty java.lang.String 的脚本
- angularjs - 在 AngularJs、REST API 中读取 cookie
- javascript - 将道具传递给子组件 - React Native
- excel - 重复时可以提取特定单词的Excel公式
- elasticsearch - 强制 react-select 使用 Elasticsearch 显示所有选项
- python - 如何计算与列表中点的距离?
- excel - Excel 宏运行帐户列表并保存结果
- angular - Angular Elements - 外部库的 CSS
- rest - 通过 Postman API 将多个用户批量分配到 Okta 中的应用程序