根据flask admin中另一个字段的值显示字段
我有一个带有“TYPE”列和许多其他字段的数据库表。在许多情况下,某些列值基于“TYPE”的值为null 例如 如果我有一个产品表,根据flask admin中另一个字段的值显示字段,flask,flask-sqlalchemy,flask-wtforms,flask-admin,Flask,Flask Sqlalchemy,Flask Wtforms,Flask Admin,我有一个带有“TYPE”列和许多其他字段的数据库表。在许多情况下,某些列值基于“TYPE”的值为null 例如 如果我有一个产品表,类型有“汽车”或“直升机”。各栏分别为: 垂直速度,水平速度和喇叭振幅 对于“汽车”类型,垂直速度应始终为null,对于“直升机”,喇叭振幅应始终为null 在flask admin中,是否有任何方法可以根据当前选择的类型的值隐藏提交的字段 如果是UI级别的更改(即出于安全性/一致性目的,不需要后端验证),则可以 在我的现实生活场景中,有10多列,其中5+在某些情况
类型
有“汽车”或“直升机”。各栏分别为:
垂直速度
,水平速度
和喇叭振幅
对于“汽车”类型,垂直速度应始终为null
,对于“直升机”,喇叭振幅应始终为null
在flask admin中,是否有任何方法可以根据当前选择的类型
的值隐藏提交的字段
如果是UI级别的更改(即出于安全性/一致性目的,不需要后端验证),则可以
在我的现实生活场景中,有10多列,其中5+在某些情况下为null
,因此,如果这些字段可以在UI中删除,那将非常有用(因为它会使表单非常长,并且容易出错)
我正在使用flask sqlalchemy作为我的flask管理员的后端 有趣的问题。这里有一个有效的解决方案。所以基本上你有产品类型,每种类型都有一些有效的属性(例如汽车和喇叭的响度)。您还可以具有与类型无关的常规属性,例如每个产品的名称 在
表单\u prefill
上,检查哪些字段对产品类型有效。然后从表单中扔掉无效字段,然后再次返回表单。其实很简单
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import flask_admin as admin
from flask_admin.contrib import sqla
app = Flask(__name__)
app.secret_key = 'arstt'
db = SQLAlchemy(app)
class Product(db.Model):
id = db.Column(db.Integer, primary_key=True)
type = db.Column(db.String)
name = db.Column(db.String)
vertical_speed = db.Column(db.Integer)
rotor_rpm = db.Column(db.Integer)
honking_loudness = db.Column(db.Integer)
def __str__(self):
return "{}".format(self.name)
class ProductView(sqla.ModelView):
general_product_attributes = ['name']
product_attributes_per_product_type_dict = {
'driving': ['honking_loudness'],
'flying': ['rotor_rpm', 'vertical_speed']
}
def on_form_prefill(self, form, id):
product = self.get_one(id)
form_attributes = self.general_product_attributes + self.product_attributes_per_product_type_dict[product.type]
for field in list(form):
if field.name not in form_attributes:
delattr(form, field.name)
return form
db.create_all()
admin = admin.Admin(app, name='Example: SQLAlchemy', template_mode='bootstrap3')
admin.add_view(ProductView(Product, db.session))
helicopter = Product(type='flying', name='helicopter1', vertical_speed=99)
car = Product(type='driving', name='car2', honking_loudness=33)
db.session.add(helicopter)
db.session.add(car)
db.session.commit()
请注意,这仅适用于编辑表单,所有属性仍显示在创建表单上,因为尚不确定产品将是什么类型。您可以覆盖创建和编辑模板,并添加一些jaascript以根据所选类型(汽车、直升机)隐藏字段任何不涉及覆盖模板的选项?任何前端方法使其也适用于创建表单?不,您必须自己实现,因为还不确定产品类型,因此不确定在创建实例时显示哪些字段。你需要javascript来实现这一点。