如何在ModelView
readonly 上创建一个字段?
class MyModelView(BaseModelView):
column_list = ('name', 'last_name', 'email')
Run Code Online (Sandbox Code Playgroud) 前提条件:
我是Python新手,特别是Flask-Admin.我创建了一个简单的测试服务,它有MondoDB,保持数据的"一对一"关系.
employeeName - >薪水
该模型看起来像这样:
class Employee(db.Document):
fullName = db.StringField(max_length=160, unique=True)
salary = db.IntField()
Run Code Online (Sandbox Code Playgroud)
我使用Flask-Admin来查看包含数据的表并进行编辑.当我想更改'salary'字段时,我只需按下'edit'按钮,在Flask-Admin的默认编辑视图中我更改整数值.我按"提交"并成功应用数据库中的新值.
问题:
但是我需要以这种方式覆盖Submit方法,因为它是功能并添加了一些自定义代码.就像我们假设我想在实际数据库提交后在日志文件中添加注释:
logging.warning('%s的工资:已更改为/%s',fullName,salary)
任何关于如何实现这一点的建议都将受到高度赞赏.也许你可以指导我走的路,因为Flask-Admin文档到目前为止还没有给我足够的帮助.
我正在尝试扩展基于烧瓶的项目https://github.com/hack4impact/flask-base/tree/master/app.这使用app/init.py和蓝图中的应用程序工厂模式.
在app/init.py我有:
import os
from flask import Flask
from flask_mail import Mail
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager
from flask_assets import Environment
from flask_wtf import CsrfProtect
from flask_compress import Compress
from flask_rq import RQ
from flask_admin import Admin, BaseView, expose
from flask_admin.contrib.sqla import ModelView
# from app.models import User
from config import config
from .assets import app_css, app_js, vendor_css, vendor_js
basedir = os.path.abspath(os.path.dirname(__file__))
mail = Mail()
db = SQLAlchemy()
csrf = CsrfProtect()
compress = Compress()
# …
Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我将“用户”和“帖子”作为模型。每个帖子都有一个用户名外键。当我在帖子模型的顶部创建ModelView时,可以在管理界面中以特定用户的身份创建帖子,如以下屏幕截图所示
添加帖子并单击“保存并添加另一个”后,“用户”将恢复为“ user1”。如何使表单记住先前的值“ user2”?
我的研究使我相信可以通过修改on_model_change和on_form_prefill并在flask会话中保存先前的值来完成,但这似乎过度设计了这么简单的任务。必须有一个更简单的方法。
我的代码可以在下面看到
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import flask_admin
from flask_admin.contrib import sqla
app = Flask(__name__)
db = SQLAlchemy()
admin = flask_admin.Admin(name='Test')
class Users(db.Model):
"""
Contains users of the database
"""
user_id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), index=True, unique=True, nullable=False)
def __str__(self):
return self.username
class Posts(db.Model):
"""
Contains users of the database
"""
post_id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(11), db.ForeignKey(Users.username), nullable=False)
post = db.Column(db.String(256))
user = db.relation(Users, backref='user')
def build_sample_db():
db.drop_all() …
Run Code Online (Sandbox Code Playgroud) 我一直努力在flask-admin中实现的一个功能是当用户编辑表单时,一旦设置了字段1就限制字段2的值.
让我用文字举一个简化的例子(实际的用例更复杂).然后我将展示实现该示例的完整要点,减去"约束"功能.
假设我们有一个数据库,可以跟踪一些软件"配方",以各种格式输出报告.在recipe
我们的样本数据库的表中有两个配方:"严重的报告","ASCII艺术".
为了实现每个配方,我们从几种方法中选择一种.method
我们数据库的表有两个方法:"tabulate_results","pretty_print".
每种方法都有参数.该methodarg
表有两个参数名称"tabulate_results"("rows","display_total")和两个参数"pretty_print"("embellishment_character","lines_to_jump").
现在,对于每个配方("严肃报告","ASCII艺术"),我们需要提供各自方法的参数值("tabulate_results","pretty_print").
对于每个记录,该recipearg
表允许我们选择一个配方(即字段1,例如"严重报告")和参数名称(即字段2).问题是显示了所有可能的参数名称,而它们需要根据字段1的值进行约束.
我们可以实现哪些过滤/约束机制,一旦我们选择"严重报告",我们知道我们将使用"tabulate_results"方法,因此只有"rows"和"display_total"参数可用?
我正在考虑一些AJAX巫术,它检查Field 1并为Field 2值设置查询,但不知道如何继续.
您可以通过使用要点来看到这一点:单击Recipe Arg
选项卡.在第一行("严重报告")中,如果您尝试通过单击来编辑"Methodarg"值,则所有四个参数名称都可用,而不是仅两个.
# full gist: please run this
from flask import Flask
from flask_admin import Admin
from flask_admin.contrib import sqla
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import Column, ForeignKey, Integer, String
from sqlalchemy.orm import relationship
# Create application
app = Flask(__name__)
# Create dummy secrey key so we can use sessions
app.config['SECRET_KEY'] = '123456790'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///a_sample_database.sqlite'
app.config['SQLALCHEMY_ECHO'] = …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Flask和Flask-SuperAdmin自定义管理员视图,但是,索引视图和子视图显然没有使用相同的is_accessible
方法:
编辑:我设法弄清楚我做错了什么.我需要在每个视图类中定义is_accessible.这是使用mixin-class完成的,如固定代码所示:
app/frontend/admin.py(固定和工作代码)
from flask.ext.security import current_user, login_required
from flask.ext.superadmin import expose, AdminIndexView
from flask.ext.superadmin.model.base import ModelAdmin
from ..core import db
# all admin views should subclass AuthMixin
class AuthMixin(object):
def is_accessible(self):
if current_user.is_authenticated() and current_user.has_role('Admin'):
return True
return False
# the view that gets used for the admin home page
class AdminIndex(AuthMixin, AdminIndexView):
# use a custom template for the admin home page
@expose('/')
def index(self):
return self.render('admin/index.jade')
# base view for all other …
Run Code Online (Sandbox Code Playgroud) 我正在尝试通过构建一个简单的Wiki(很大程度上基于Flask-Admin示例)来学习Python/Flask/SQLAlchemy,但我正在努力理解如何从我的多对多关系中获取一个新列来显示.
我已经成功创建了Wiki并为标签创建了一个多对多的关系表而没有任何问题(并且标签在我看到的情况下正常工作),但是我想将标签显示为列而无法获取逻辑成功了.
目标:我想显示一个列,显示多对多关联表引用的标记.
这是我想要完成的图片:
以下是我认为的相关代码:
wiki_tags_table = db.Table('wiki_tags', db.Model.metadata,
db.Column('wiki_id', db.Integer, db.ForeignKey('wiki.id')),
db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'))
)
class Wiki(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100), unique=True)
description = db.Column(db.Text)
path = db.Column(db.Unicode(256))
date_added = db.Column(db.DateTime)
tags_id = db.Column(db.Integer, db.ForeignKey('tag.id'))
tags = db.relationship('Tag', secondary=wiki_tags_table, backref=db.backref('wiki_tags_table', lazy='dynamic'))
def __unicode__(self):
return self.item
class WikiAdmin(sqla.ModelView):
column_exclude_list = ['path']
column_hide_backrefs = False
form_overrides = {
'path': form.FileUploadField
}
form_args = {
'path': {
'label': 'File',
'base_path': file_path
}
}
column_searchable_list = ('title', …
Run Code Online (Sandbox Code Playgroud) 我是Flask的新手,并注意到有两个插件可以启用CRUD视图和授权登录,Flask-Admin和Flask-AppBuilder.
这两个特性让我感兴趣的是我的模型的Master-Detail视图,我可以在同一个屏幕上看到主表的行和相关的详细信息.
知道哪一个更喜欢?我看到Flask-AppBuilder在Github上有更多的提交,而Flask-Admin有更多的明星.
如何分辨,不花太多时间选错?
据我所知,Flask Admin支持AJAX用于外键模型加载.该瓶管理员-模型文档覆盖标题下的基本知识form_ajax_refs
.我已成功地在很多场合成功使用它,但是我希望实现自定义级别的问题.让我详细说明一下.
我有一个Product
模型,一个Organisation
模型和一个连接表来关联它们,定义如下:
class Product(Base):
__tablename__ = "products"
product_uuid = Column(UUID(as_uuid=True), primary_key=True)
title = Column(String, nullable=False)
description = Column(String, nullable=False)
last_seen = Column(DateTime(timezone=True), nullable=False, index=True)
price = Column(Numeric(precision=7, scale=2), nullable=False, index=True)
class Organisation(Base):
__tablename__ = "organisations"
org_id = Column(String, primary_key=True)
org_name = Column(String, nullable=False)
products = relationship(
Product,
secondary="organisation_products",
backref="organisations"
)
organisation_products_table = Table(
"organisation_products",
Base.metadata,
Column("org_id", String, ForeignKey("organisations.org_id"), nullable=False),
Column("product_uuid", UUID(as_uuid=True), ForeignKey("products.product_uuid"), nullable=False),
UniqueConstraint("org_id", "product_uuid"),
)
Run Code Online (Sandbox Code Playgroud)
在名为模型的Flask管理模型视图中,该模型CuratedList
具有模型的外键约束Product
,我 …