【发布时间】:2014-06-17 23:23:34
【问题描述】:
在 WTForms 中,我可以根据数据库中的数据创建自定义验证器吗?
例如,我想显示一个多选字段,其中用户只能根据他们的帐户类型(存储在数据库中)选择一定数量的值。
预期的行为是这样的:
- 如果表单已提交,请检查选择了多少个值。
- 运行数据库查询,获取账户类型。
- 检查#1 是否小于或等于#2。
- 如果是,则认为它有效。
这可能吗?
【问题讨论】:
标签: wtforms flask-wtforms
在 WTForms 中,我可以根据数据库中的数据创建自定义验证器吗?
例如,我想显示一个多选字段,其中用户只能根据他们的帐户类型(存储在数据库中)选择一定数量的值。
预期的行为是这样的:
这可能吗?
【问题讨论】:
标签: wtforms flask-wtforms
您可以编写一个自定义验证器来执行您在 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 方法来验证表单提交。这适用于测试字符串的长度、数字是否在范围内等。一旦验证场景变得足够复杂,您将花费更多的时间来尝试使库满足您的需求,而不是自己编写验证。
【讨论】:
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.。如果我删除该方法,我的表单会正常加载。