2017-03-23 6 views
1

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:

ServerView

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") 
+0

in 'sollte form_args' nicht 'max_allowed' ist' max_allowed() '? – pjcunningham

+0

@pjcunningham Nein, Sie müssen die Funktionsreferenz übergeben, also ist die Art, wie er es tut, richtig. – MrLeeh

+0

@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

Antwort

1

Statt form_args, ich on_model_change tat:

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 
Verwandte Themen