Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
根据flask admin中另一个字段的值显示字段_Flask_Flask Sqlalchemy_Flask Wtforms_Flask Admin - Fatal编程技术网

根据flask admin中另一个字段的值显示字段

根据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+在某些情况

我有一个带有“TYPE”列和许多其他字段的数据库表。在许多情况下,某些列值基于“TYPE”的值为null

例如

如果我有一个产品表,
类型
有“汽车”或“直升机”。各栏分别为:

垂直速度
水平速度
喇叭振幅

对于“汽车”类型,垂直速度应始终为
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来实现这一点。