Python Flask:对多个表单字段进行条件验证
让我从平常开始——我对Python和Flask都是新手。在发布这个问题之前(我在这里的第一个问题),我花了几个小时搜索和实验,不幸的是到目前为止没有运气 我正在构建web表单,用户可以在其中定义防火墙规则,这些规则随后会记录在数据库中。我在验证阶段,我来到了一堵墙这里。。。希望有人能帮助我 我的(此处简化)表单有两个字段-src_ip和dst_ip:Python Flask:对多个表单字段进行条件验证,python,forms,validation,flask,flask-wtforms,Python,Forms,Validation,Flask,Flask Wtforms,让我从平常开始——我对Python和Flask都是新手。在发布这个问题之前(我在这里的第一个问题),我花了几个小时搜索和实验,不幸的是到目前为止没有运气 我正在构建web表单,用户可以在其中定义防火墙规则,这些规则随后会记录在数据库中。我在验证阶段,我来到了一堵墙这里。。。希望有人能帮助我 我的(此处简化)表单有两个字段-src_ip和dst_ip: class FirewallRule(Form) src_ip = StringField('Source IP') dst_ip
class FirewallRule(Form)
src_ip = StringField('Source IP')
dst_ip = StringField('Destination IP')
我的验证要求是:
提前感谢。您缺少一个非常有用的验证器:。此验证器允许您说字段可以为空,但如果它不为空,则应使用其他验证器 关于至少填写其中一个字段的部分,我会使用自定义验证方法,我认为没有任何股票验证器可以提供帮助 所以应该是这样的:
class FirewallRule(Form)
src_ip = StringField('Source IP', validators=[Optional(), IPAddress()])
dst_ip = StringField('Destination IP', validators=[Optional(), IPAddress()])
def validate(self):
if not super(FirewallRule, self).validate():
return False
if not self.src_ip.data and not self.dst_ip.data:
msg = 'At least one of Source and Destination IP must be set'
self.src_ip.errors.append(msg)
self.dst_ip.errors.append(msg)
return False
return True
如果您想避免自定义验证函数,那么请考虑创建一个ValueActer类来检查是否设置了一个字段列表中的至少一个是相当容易的。如果您愿意遵循这条路线,您可以查看验证程序的实现以获得灵感。
您可以尝试重新加载表单的方法,并在需要时进行提升。@dizballanze这将使我确保至少有一个字段已填充,但我将无法使用验证程序验证输入非常感谢Miguel。我知道Optional(),但我不知道将它与另一个验证器绑定会有这样的效果-这很聪明!!谢谢米格尔的回答。它帮助了我。但我有一个问题。我有两个字段,StringField和BooleanField。应该选择其中一个。您的解决方案对我有效,但我无法将BooleanField设置为error(错误消息显示StringFeild没有问题,但BooleanField没有问题)。我的意思是我无法将错误附加到该字段。有解决办法吗?任何帮助都很好:)@Pradeepb您应该能够在任何字段上设置错误。您确定问题不在呈现复选框的方式上吗?为复选框呈现的HTML必须包含错误消息,就像文本字段一样。