【问题标题】:Pass variable to Python Flask form将变量传递给 Python Flask 表单
【发布时间】:2016-12-20 13:50:21
【问题描述】:

我目前正试图为我的 Flask 表单构建可变消息闪烁功能

由于我正在构建一个必须支持多种语言的工具,因此我希望根据特定语言输入为我的烧瓶表单验证创建自定义消息。

我的表单看起来像这样:

class messageForm(FlaskForm):
    title = StringField(
        'title',
        validators=[
            validators.DataRequired(validationMessage('validateRequired', language=language))
        ]
    )

函数“validationMessage”如下所示:

def validationMessage(message, language):
    msg = Message.query.filter_by(title=message).first()
    lang = Language.query.filter_by(abbr=language).first()
    text = messageBody.query.filter_by(message_id=msg.id, language_id=lang.id).first().text
    return text

如您所见,我在几个数据库表中进行了一些查找以生成我的消息文本。

我现在的麻烦是... 如何将视图中的语言变量传递给表单,以便将其传递给“validationMessage”函数?

语言变量基于我的视图端点中的变量

# Messages
@admin.route('/<string:language>/message', methods=['GET'])
def messageView(language='dk')
    form=messageForm()
    ...

我考虑过为此使用我的会话,但据我了解,我只能在我的视图中使用它,因此不能在我的表单或消息功能中使用

【问题讨论】:

  • 您始终可以在表单中添加一个 HiddenField,然后在您在视图中构造它之后设置该参数。然后该值应该在您的表单实例中可供您使用
  • 我可以这样做,如果我需要将变量传递给我的模板,不幸的是我需要将变量传递给我的 Form 类,因此它对我不起作用。跨度>
  • 我假设您使用的是flask-wtforms?如果是这样,可以使用字段的 kwargs 实例化表单。因此,如果您有一个名为langHiddenField,您的表单可以实例化为form=messageForm(lang=language)。然后将验证器 language 参数设置为您的 HiddenField
  • 尝试这个我不幸得到以下错误:
  • 问题实际上是 validationMessage 函数仅在初始化验证器时被调用。当您启动 Flask 应用程序时,就会发生这种情况。稍后在表单验证中不再调用它。所以这种方法根本行不通。

标签: python forms flask parameter-passing


【解决方案1】:

您可以通过使用全局上下文变量g 来解决这个问题。诀窍不是使用内置验证器,而是使用自定义验证器。原因是内置验证器是一个工厂函数。这意味着您传递给它的 validationMessage 函数只会在创建类时执行。如果您构建自定义验证器并从全局上下文变量中读取language,它将起作用。

def custom_validator(form, field):
    language = g.language
    msg = Message.query.filter_by(title=message).first()
    lang = Language.query.filter_by(abbr=language).first()
    text = messageBody.query.filter_by(message_id=msg.id, language_id=lang.id).first().text

    if not len(field.data):
        raise validators.ValidationError(text)

用自定义验证器替换表单中的验证器:

class messageForm(FlaskForm):
    title = StringField('title', validators=[custom_validator])

在视图函数中,只需为全局上下文变量创建语言属性。

# Messages
@admin.route('/<string:language>/message', methods=['GET'])
def messageView(language='dk')
    g.language = language
    form=messageForm()
    ...

【讨论】:

  • 这是否也适用于传递给SelectField 的自定义choices 参数?如果是,如何创建自定义选择功能?我尝试了一个使用全局变量的函数,该函数返回在 main() 函数的开头设置全局变量的选项。但这不起作用
猜你喜欢
  • 2019-01-02
  • 2023-01-11
  • 1970-01-01
  • 2016-07-08
  • 1970-01-01
  • 1970-01-01
  • 2022-07-17
  • 1970-01-01
相关资源
最近更新 更多