可以根据语言 cookie 内容有条件地构建一个烧瓶 "WTForms class"
Possible to build a flask "WTForms class" conditionally based on language cookie content
在我的 FLask 应用程序中,我使用 Cookie 来设置语言。
因此我能够调用路由并呈现模板,将 languagecookie 的值传递给模板,并使用 HTML 模板中的条件 jinja IF 语句呈现它。
我还使用 WTForms 在我的模板中构建和呈现表单(例如联系表单)
@app.route('/contact', methods=['GET'])
def contact():
languageCookie = request.cookies.get('language')
form = ContactForm()
return render_template('contact.html', language=languageCookie, ContactForm = form)
class ContactForm(FlaskForm):
Name = StringField('Naam',
validators=[InputRequired(message="Een naam is verplicht"),
Length(min=2, max=25, message="Minimum 2 en maximum 25 characters")],
render_kw={'class':'form-control g-color-black g-bg-white g-bg-white--focus g-brd-gray-light-v4 g-brd-primary--focus rounded-3 g-py-13 g-px-15','placeholder':'Naam'})
我的问题是,是否可以根据语言 cookie 的值更改此 WTForm class 中的内容?
例如在验证器中更改字段的消息值等
已经尝试过,但没有成功,因为 cookie 在路由之外没有引用。
让 WTForms class 具有语言意识的更好方法应该是什么?
非常感谢!
这是我测试过的解决方案:
@app.route('/contact')
def contact():
languageCookie = request.cookies.get('language')
form = ContactForm(languageCookie)
return render_template('contact.html', language=languageCookie, ContactForm=form)
name_field = {
'language1': {
'label': 'label in language 1',
'required_message': 'required_message in language 1',
'length_message': 'length_message in language 1',
'placeholder': 'placeholder in language 1'
},
'language2': {
'label': 'label in language 2',
'required_message': 'required_message in language 2',
'length_message': 'length_message in language 2',
'placeholder': 'placeholder in language 2',
}
}
def ContactForm(language):
class Form(FlaskForm):
name = StringField(name_field[language]['label'],
validators=[
InputRequired(message=name_field[language]['required_message']),
Length(min=2, max=25, message=name_field[language]['length_message'])
],
render_kw={'class': 'classes', 'placeholder': name_field[language]['placeholder']})
return Form()
您创建实际表单 class 并在一个函数中实例化 class,每次用户查看 /contact
时都会调用该函数。我不推荐这样做,因为你必须为每个字段创建一个字典,这可能会变得乏味。
如果你想向用户显示相同的消息,但翻译成他们的语言,我会使用 flask-babel 来为你处理翻译。最初需要做更多的工作,但将来会让您的生活更轻松。这是一个tutorial.
您可以通过更改 get_locale 函数
来合并您的 cookie 系统
@babel.localeselector
def get_locale():
return request.cookies.get('language')
在我的 FLask 应用程序中,我使用 Cookie 来设置语言。
因此我能够调用路由并呈现模板,将 languagecookie 的值传递给模板,并使用 HTML 模板中的条件 jinja IF 语句呈现它。
我还使用 WTForms 在我的模板中构建和呈现表单(例如联系表单)
@app.route('/contact', methods=['GET'])
def contact():
languageCookie = request.cookies.get('language')
form = ContactForm()
return render_template('contact.html', language=languageCookie, ContactForm = form)
class ContactForm(FlaskForm):
Name = StringField('Naam',
validators=[InputRequired(message="Een naam is verplicht"),
Length(min=2, max=25, message="Minimum 2 en maximum 25 characters")],
render_kw={'class':'form-control g-color-black g-bg-white g-bg-white--focus g-brd-gray-light-v4 g-brd-primary--focus rounded-3 g-py-13 g-px-15','placeholder':'Naam'})
我的问题是,是否可以根据语言 cookie 的值更改此 WTForm class 中的内容?
例如在验证器中更改字段的消息值等
已经尝试过,但没有成功,因为 cookie 在路由之外没有引用。 让 WTForms class 具有语言意识的更好方法应该是什么?
非常感谢!
这是我测试过的解决方案:
@app.route('/contact')
def contact():
languageCookie = request.cookies.get('language')
form = ContactForm(languageCookie)
return render_template('contact.html', language=languageCookie, ContactForm=form)
name_field = {
'language1': {
'label': 'label in language 1',
'required_message': 'required_message in language 1',
'length_message': 'length_message in language 1',
'placeholder': 'placeholder in language 1'
},
'language2': {
'label': 'label in language 2',
'required_message': 'required_message in language 2',
'length_message': 'length_message in language 2',
'placeholder': 'placeholder in language 2',
}
}
def ContactForm(language):
class Form(FlaskForm):
name = StringField(name_field[language]['label'],
validators=[
InputRequired(message=name_field[language]['required_message']),
Length(min=2, max=25, message=name_field[language]['length_message'])
],
render_kw={'class': 'classes', 'placeholder': name_field[language]['placeholder']})
return Form()
您创建实际表单 class 并在一个函数中实例化 class,每次用户查看 /contact
时都会调用该函数。我不推荐这样做,因为你必须为每个字段创建一个字典,这可能会变得乏味。
如果你想向用户显示相同的消息,但翻译成他们的语言,我会使用 flask-babel 来为你处理翻译。最初需要做更多的工作,但将来会让您的生活更轻松。这是一个tutorial.
您可以通过更改 get_locale 函数
来合并您的 cookie 系统@babel.localeselector
def get_locale():
return request.cookies.get('language')