【发布时间】:2017-03-23 17:37:51
【问题描述】:
我想在 Flask Admin 上执行一些验证。 Flask 应用程序连接到后端 postgreSQL 数据库并使用 SQLAlchemy ORM。
我希望能够对 ServerView(flask.ext.admin.contrib.sqla.modelView) 中的两个字段(lan_nics、wan_nics)执行验证检查。基本上我想确保两个字段的总和不大于某个数字。这是表格:
这里是 test_app 代码。我试图遵循烧瓶管理员的文档。我添加了一个 def,然后在 form_args for validators 字典中引用了该 def ......但它似乎不起作用。目前我只是想确保两个字段的值都小于 5。
from flask import Flask
from flask.ext.admin import Admin
from flask.ext.admin.contrib.sqla import ModelView
from flask.ext.sqlalchemy import SQLAlchemy
from wtforms.validators import ValidationError
import psycopg2
# Flask and Flask-SQLAlchemy initialization here
app = Flask(__name__)
db = SQLAlchemy(app)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://postgres:postgres@127.0.0.1/testdb'
app.secret_key = 'MySecret'
conn = psycopg2.connect("dbname='testdb' user='postgres' host='127.0.0.1' password='postgres'")
class Server(db.Model):
__tablename__ = "server"
id = db.Column('server_id', db.Integer, primary_key=True)
model = db.Column('model', db.Unicode)
lan_nics = db.Column('lan_nics', db.Integer)
wan_nics = db.Column('wan_nics', db.Integer)
def __str__(self):
return self.model
class Hardware(db.Model):
__tablename__ = "hardware"
id = db.Column('hardware_id', db.Integer, primary_key=True)
model = db.Column('model', db.Unicode)
max_nics = db.Column('max_nics', db.Integer)
def __str__(self):
return self.model
class ServerView(ModelView):
# Disable model creation
can_create = True
# Override displayed fields
column_list = ('model', 'lan_nics', 'wan_nics')
column_display_all_relations = True
column_searchable_list = ('model')
column_labels = dict(model='Model', lan_nics='LAN Nics', wan_nics='WAN NICs')
form_columns = [ 'model', 'lan_nics', 'wan_nics' ]
def max_allowed(form, field):
if field.data > 5:
raise ValidationError('Max number of interfaces exceeded')
form_args = dict(
lan_nics=dict(validators=[max_allowed]),
wan_nics=dict(validators=[max_allowed])
)
class HardwareView(ModelView):
# Disable model creation
can_create = True
# Override displayed fields
column_list = ('model', 'max_nics')
column_display_all_relations = True
column_searchable_list = ('model')
column_labels = dict(model='Model', max_nics='Max Nics')
form_columns = ['model', 'max_nics' ]
def __str__(self):
return self.model
admin = Admin(app, name="MyApp1")
# Add administrative views here
admin.add_view(ModelView(Server, db.session))
admin.add_view(ModelView(Hardware, db.session))
app.run(port=8000, host="0.0.0.0")
【问题讨论】:
-
在
form_args中max_allowed不应该是max_allowed()吗? -
@pjcunningham 不,你需要传递函数引用,所以他这样做的方式是对的。
-
@Jayjay_Jay 你这样做的方式应该确实有效。验证器已正确实施。检查字段
lan_nics和wan_nics的类型是整数还是浮点数。如果它们是字符串,则需要将它们转换为 int 才能使其正常工作。
标签: python validation flask wtforms flask-admin