Ich möchte eine Überprüfung auf Flask-Admin durchführen. Die Flask-App ist mit einer Back-End-PostgreSQL-Datenbank verbunden und verwendet SQLAlchemy ORM.So führen Sie eine Validierung für Flask-Admin-Felder durch
Ich möchte in der ServerView (flask.ext.admin.contrib.sqla.modelView) Validierungsprüfungen für zwei Felder (Lan_nics, Wan_nics) durchführen. Grundsätzlich möchte ich sicherstellen, dass die Summe zweier Felder nicht größer als eine bestimmte Anzahl ist. Hier ist die Form:
Hier ist der test_app Code. Ich habe versucht, der Dokumentation für Flask-Admin zu folgen. Ich fügte ein def hinzu und referenzierte dann dieses def in den form_args für validators Wörterbuch ... aber es scheint nicht zu arbeiten. Im Moment bin versucht, ich nur noch dafür sorgen, dass beide Felder einen Wert von weniger als 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:[email protected]/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")
in 'sollte form_args' nicht 'max_allowed' ist' max_allowed() '? – pjcunningham
@pjcunningham Nein, Sie müssen die Funktionsreferenz übergeben, also ist die Art, wie er es tut, richtig. – MrLeeh
@Jayjay_Jay Die Art, wie Sie es tun, sollte eigentlich funktionieren. Die Validatoren sind korrekt implementiert. Überprüfen Sie, ob die Felder 'lan_nics' und' wan_nics' vom Typ Integer oder float sind. Wenn sie Zeichenfolgen sind, müssen Sie sie in int umwandeln, damit dies funktioniert. – MrLeeh