【问题标题】:WTForms: Custom Validator Based on DB Data?WTForms:基于数据库数据的自定义验证器?
【发布时间】:2014-06-17 23:23:34
【问题描述】:

在 WTForms 中,我可以根据数据库中的数据创建自定义验证器吗?

例如,我想显示一个多选字段,其中用户只能根据他们的帐户类型(存储在数据库中)选择一定数量的值。

预期的行为是这样的:

  1. 如果表单已提交,请检查选择了多少个值。
  2. 运行数据库查询,获取账户类型。
  3. 检查#1 是否小于或等于#2。
  4. 如果是,则认为它有效。

这可能吗?

【问题讨论】:

    标签: wtforms flask-wtforms


    【解决方案1】:

    您可以编写一个自定义验证器来执行您在 python 中可以执行的任何操作:

    user = # get user from request context
    
    def account_type_check(form, field):
        account = get_account_for_user(user) # insert your account retrieval logic here
    
        if len(field.data) > account.user_limit:
            raise ValidationError('Submission exceeded user's account type limit')
    
    class SelectionForm(Form):
        selection = MultiSelectField('Selection', [account_type_check])
    

    值得注意的是,您可以说是在使用恶意工具来处理此类事情。表单验证库的目的是提供一种DRY 方法来验证表单提交。这适用于测试字符串的长度、数字是否在范围内等。一旦验证场景变得足够复杂,您将花费更多的时间来尝试使库满足您的需求,而不是自己编写验证。

    【讨论】:

    • 我无法找到放置此方法的正确位置。如果它进入我的 forms.py,我将无法访问 current_user 数据。如果它出现在我的views.py 中,那么在forms.py 中定义account_type_check 将是一个问题。你有什么想法?
    • 您可以将任何内容导入任何其他命名空间。 from views import account_type_check 我假设 account_type_check 可以访问用户数据。或者,您可以将它们全部放在同一个文件中。 Flask 不会在意的。
    • 出于某种原因,如果我在我看来定义account_type_check,我会得到NameError: name 'SelectionForm' is not defined.。如果我删除该方法,我的表单会正常加载。
    • 您应该将另一个问题与一个最小的工作示例放在一起,以证明您的问题。我没有从这些 cmets 获得的足够信息来帮助您。
    猜你喜欢
    • 2015-07-31
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-13
    • 2011-09-29
    • 1970-01-01
    相关资源
    最近更新 更多