可以根据语言cookie内容有条件地构建一个“WTForms类”

2024-09-30 18:15:21 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的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类中的内容

例如,在验证程序中更改字段的消息值等

已尝试,但未成功,因为cookie在路由外没有引用。 让WTForms类具有语言意识的更好方法是什么

非常感谢


Tags: form模板语言表单路由messagecontactrender
1条回答
网友
1楼 · 发布于 2024-09-30 18:15:21

下面是我测试过的一个解决方案:

@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()

创建实际的表单类并在一个函数中实例化该类,每次用户查看/contact时都会调用该函数。不过我不建议这样做,因为你必须为每个字段创建一个字典,这可能会变得很乏味

如果您希望将相同的消息显示给用户,但翻译成他们的语言,我将使用flask babel为您处理翻译。这是一个多一点的工作开始,但会使你的生活更容易在未来。这是一个tutorial

您可以通过更改get_locale函数来合并cookie系统

@babel.localeselector
def get_locale():
    return request.cookies.get('language')

相关问题 更多 >