python - 如何对 Flask-admin 字段执行验证

标签 python validation flask wtforms flask-admin

我想在 Flask Admin 上执行一些验证。 Flask 应用程序连接到后端 postgreSQL DB 并使用 SQLAlchemy ORM。

我希望能够对 ServerView(flask.ext.admin.contrib.sqla.modelView) 中的两个字段(lan_nics、wan_nics)执行验证检查。基本上我想确保两个字段的总和不大于某个数字。表格如下:

ServerView

这是 test_app 代码。我尝试遵循 Flask-admin 的文档。我添加了一个 def,然后在验证器字典的 form_args 中引用了该 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:<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="f3839c808794819680b3c2c1c4ddc3ddc3ddc2" rel="noreferrer noopener nofollow">[email protected]</a>/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,而是使用 on_model_change:

class ServerView(ModelView):
    ...
    ...
    ...

    def on_model_change(self, form, model, is_created):
        hardware = "hardware"
        query = "SELECT nics FROM hardware WHERE model = '{}'".format(hardware)
        with conn.cursor() as cur:
            cur.execute(query)
            max_nics = int(cur.fetchone()[0])
        if (int(form.lan.data) + int(form.wan.data) > max_nics):
            raise ValidationError('Max number of interfaces exceeded!')
        else:
            return model

关于python - 如何对 Flask-admin 字段执行验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42983181/

相关文章:

python - 使用 Flask+Python 处理无效 GET/POST 请求参数的最佳方法?

python - 在 matplotlib 中绘制最后 100 个点

python - 当我的函数没有接收到参数时,我如何告诉它做一些特定的事情?

javascript - Angular 中自定义表单验证的好策略是什么?

ruby-on-rails - Rails ActiveRecord : Skip validations for associations

javascript - 无法让 mongoose-unique-validator 工作

python - 使用 strftime 在 Jinja2(Flask) 中格式化 "posted x seconds ago"?

python - 使用蓝图进行 API 版本控制会导致冲突

python - 如何获取python打印功能的源代码?

python - 将数据帧转换为 JSON,并使用 1 个公共(public)值列作为数组字段