使用 SQLAlchemy 覆盖 FlaskAdmin 的默认 WTF 表单验证
Override Default WTF forms validation for FlaskAdmin with SQLAlchemy
Web 应用程序似乎仍在应用默认的 WTF 表单验证,请问如何禁用此功能?基本上,子网字段正在执行我的自定义验证(参见图片 1):
但是,它似乎还应用了我不希望它执行的默认验证(IP 地址验证):
请告诉我如何防止这种情况发生。请参阅下面的相关代码片段:
from sqlalchemy.dialects.postgresql import INET
...
...
...
app = Flask(__name__)
...
...
db = SQLAlchemy(app)
...
...
class Ipac(db.Model):
__tablename__ = "ipac"
id = db.Column('id', db.Integer, primary_key=True)
subnet = db.Column('subnet', INET)
gateway = db.Column('gateway', INET)
vrip = db.Column('vrip', INET)
serverid = db.Column('serverid', db.Integer, db.ForeignKey('server.id'))
def __str__(self):
return self.subnet
...
...
class IpacView(ModelView):
def subnet_format(form, field):
if not re.match(r'\b(([0-9]|[0-9]{2}|2[0-5]{2}|2[0-4][0-9]|1[0-9]{2})\.){3}([0-9]|[0-9]{2}|2[0-5]{2}|2[0-4][0-9]|1[0-9]{2})\/(3[0-2]|2[0-9]|1[0-9]|[0-9])\b', field.data):
raise ValidationError("Must be a valid subnet format!")
column_display_all_relations = True
column_labels = dict(subnet='Subnet', gateway='Gateway', vrip='VR IP')
column_searchable_list = ('subnet', 'vrip', 'gateway', 'server.hostname')
form_args = dict(
subnet=dict(validators=[subnet_format])
)
def is_accessible(self):
return login.current_user.is_authenticated
...
...
如果您的正则表达式匹配,您需要调用 StopValidation()
方法。这将停止验证链中的任何进一步调用。
from wtforms.validators import StopValidation
# ....
class IpacView(ModelView):
def subnet_format(form, field):
if not re.match(
r'\b(([0-9]|[0-9]{2}|2[0-5]{2}|2[0-4][0-9]|1[0-9]{2})\.){3}([0-9]|[0-9]{2}|2[0-5]{2}|2[0-4][0-9]|1[0-9]{2})\/(3[0-2]|2[0-9]|1[0-9]|[0-9])\b',
field.data):
raise ValidationError("Must be a valid subnet format!")
else:
raise StopValidation()
# etc ...
Web 应用程序似乎仍在应用默认的 WTF 表单验证,请问如何禁用此功能?基本上,子网字段正在执行我的自定义验证(参见图片 1):
但是,它似乎还应用了我不希望它执行的默认验证(IP 地址验证):
请告诉我如何防止这种情况发生。请参阅下面的相关代码片段:
from sqlalchemy.dialects.postgresql import INET
...
...
...
app = Flask(__name__)
...
...
db = SQLAlchemy(app)
...
...
class Ipac(db.Model):
__tablename__ = "ipac"
id = db.Column('id', db.Integer, primary_key=True)
subnet = db.Column('subnet', INET)
gateway = db.Column('gateway', INET)
vrip = db.Column('vrip', INET)
serverid = db.Column('serverid', db.Integer, db.ForeignKey('server.id'))
def __str__(self):
return self.subnet
...
...
class IpacView(ModelView):
def subnet_format(form, field):
if not re.match(r'\b(([0-9]|[0-9]{2}|2[0-5]{2}|2[0-4][0-9]|1[0-9]{2})\.){3}([0-9]|[0-9]{2}|2[0-5]{2}|2[0-4][0-9]|1[0-9]{2})\/(3[0-2]|2[0-9]|1[0-9]|[0-9])\b', field.data):
raise ValidationError("Must be a valid subnet format!")
column_display_all_relations = True
column_labels = dict(subnet='Subnet', gateway='Gateway', vrip='VR IP')
column_searchable_list = ('subnet', 'vrip', 'gateway', 'server.hostname')
form_args = dict(
subnet=dict(validators=[subnet_format])
)
def is_accessible(self):
return login.current_user.is_authenticated
...
...
如果您的正则表达式匹配,您需要调用 StopValidation()
方法。这将停止验证链中的任何进一步调用。
from wtforms.validators import StopValidation
# ....
class IpacView(ModelView):
def subnet_format(form, field):
if not re.match(
r'\b(([0-9]|[0-9]{2}|2[0-5]{2}|2[0-4][0-9]|1[0-9]{2})\.){3}([0-9]|[0-9]{2}|2[0-5]{2}|2[0-4][0-9]|1[0-9]{2})\/(3[0-2]|2[0-9]|1[0-9]|[0-9])\b',
field.data):
raise ValidationError("Must be a valid subnet format!")
else:
raise StopValidation()
# etc ...