我有一个User模型类,password是许多中的一个属性.我正在使用Flask Web框架和Flask-Admin扩展来创建我的模型类的管理视图.我想在管理视图中使某些字段像password不可编辑或根本不显示它们.我该怎么做?
我可以使字段不显示在普通视图中,但是当我单击表格中任何记录的编辑按钮时,所有字段都会显示并且可以编辑.
我正在尝试在Flask-Admin应用中扩展一对多字段以使用自定义Select2字段.该字段的javascript代码如下所示:
function format(data) {
if (!data.id) return data.text; // optgroup
return "<img class='flag' src='" + data.text + "'/>" + data.id;
}
function formatSelection(data) {
return data.id;
}
$("#da2").select2({
maximumSelectionSize: 3,
formatResult: format,
formatSelection: formatSelection,
escapeMarkup: function(m) { return m; }
});
Run Code Online (Sandbox Code Playgroud)
我不确定在视图代码中需要更改什么.我尝试过这样的事情:
class PostForm(wtf.Form):
title = fields.TextField('Title')
photos = fields.SelectField('Photo', widget=widgets.Select(multiple=True), id='da2')
class PostView(ModelView):
form = PostForm
def _feed_user_choices(self, mform):
photos = Photo.query.all()
mform.photos.choices = [(x.path, url_for('static',
filename=form.thumbgen_filename(x.path))) for x in photos]
return mform
def create_form(self):
form = super(Post2View, self).create_form() …Run Code Online (Sandbox Code Playgroud) 我想在模型视图中添加金额(自定义字段)的过滤器
class FarmerAdmin(ModelView):
column_descriptions = dict(amount = "All Transactions Total (Rs.)")
column_searchable_list = ('name','village','phone')
column_editable_list = ('phone',)
column_filters = ('village','area',\
filters.FloatGreaterFilter('amount','Amount'))
inline_models = (Transaction,)
def get_query(self):
return self.session.query(
Farmer.id.label("id"),
Farmer.name.label("name"),
Farmer.village.label("village"),
Farmer.phone.label("phone"),
Farmer.area.label("area"),
func.sum(Transaction.total).label("amount")
).join(Transaction).group_by(Farmer.id)
def scaffold_sortable_columns(self):
return {'id':'id','name':'name','village':'village',\
'area':'area','amount':'amount'}
def scaffold_list_columns(self):
return ['id','name','village','phone','area','amount']
def __init__(self, session):
super(FarmerAdmin, self).__init__(Farmer, session)
Run Code Online (Sandbox Code Playgroud)
通过重写scaffold_sortable_columns方法,排序很有效.有没有办法为量列添加标准过滤器(大于,小于).
我正在尝试使用Flask-Admin为下面显示的Matriline模型创建一个创建/编辑表单.此模型具有字符串字段名称和字段pod_id,其具有对另一个模型Pod的外键约束,其本身具有到Clan模型的外键字段.
Flask-Admin创建的默认表单显示了名称字段和Pod实例的选择字段,但我想添加一个字段Clan,它将根据所选的Clan实例重置Pod列表.
要添加Clan字段,我会覆盖Matriline的默认ModelView,并在所有Clan实例中添加一个额外的select字段Clan,如下面的MatrilineView视图所示.
现在我需要在渲染的表单中添加一些Ajax代码,以便在每次选择新的clan时重置pod列表.
我是否必须完全替换默认表单,包括Ajax代码?或者使用Flask-Admin有更简单的方法吗?
<b>models.py</b>
...
class Matriline(db.Model):
__tablename__ = 'matriline'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.Unicode(64))
pod_id = db.Column(db.Integer, db.ForeignKey('pod.id'))
def __unicode__(self):
return self.name
class Pod(db.Model):
__tablename__ = 'pod'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.Unicode(64))
matrilines = db.relationship('Matriline', backref='pod', lazy='select')
clan_id = db.Column(db.Integer, db.ForeignKey('clan.id'))
def __unicode__(self):
return self.name
class Clan(db.Model): …Run Code Online (Sandbox Code Playgroud) 使用Flask-Admin + Flask-SQLAlchemy我定义了三个模型:User,Apikey,Exchange.
当经过身份验证的用户通过Web管理界面创建新的Apikey时,我希望插入数据库的新行上的user_id设置为登录的当前user_id.
使用我当前的实现,用户可以选择她喜欢的任何用户(这是不希望的).
这是我对模型的定义:
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
first_name = db.Column(db.String(255))
last_name = db.Column(db.String(255))
email = db.Column(db.String(255), unique=True)
password = db.Column(db.String(255))
active = db.Column(db.Boolean())
confirmed_at = db.Column(db.DateTime())
roles = db.relationship('Role', secondary=roles_users,
backref=db.backref('users', lazy='dynamic'))
apikeys = db.relationship('Apikey', backref='user')
def __str__(self):
return self.email
class Apikey(db.Model):
id = db.Column(db.Integer, primary_key=True)
exch_user = db.Column(db.String(255))
exch_pass = db.Column(db.String(255))
exch_key = db.Column(db.String(255))
exch_secret = db.Column(db.String(255))
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
exch_id = db.Column(db.Integer, db.ForeignKey('exchange.id'))
class Exchange(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = …Run Code Online (Sandbox Code Playgroud) 我从这里获取了Flask-Admin auth示例并略微更改了它.
我在下面的视图中添加了以下块,但它没有显示导出按钮.我期待它将导出选项添加到管理视图.它会打印---superuser到控制台.
if current_user.has_role('superuser'):
can_export = True
print ' ---- superuser '
Run Code Online (Sandbox Code Playgroud)
我以前多次使用导出功能.如果我把声明放在can_export = True下面,class MyModelView(sqla.ModelView):我将使用它作为控制基于用户角色创建/编辑/ etc的访问的示例.例如,我想要一个只读的角色,其中can_create = False,can_edit = False等.
有人可以帮忙吗?有人能告诉我我做错了什么吗?
==
这是整个视图.
# Create customized model view class
class MyModelView(sqla.ModelView):
def is_accessible(self):
if not current_user.is_active or not current_user.is_authenticated:
return False
if current_user.has_role('superuser'):
return True
return False
def _handle_view(self, name, **kwargs):
"""
Override builtin _handle_view in order to redirect users when a view is not accessible.
"""
if current_user.has_role('superuser'):
can_export …Run Code Online (Sandbox Code Playgroud) 好吧,我最近接触了flask-admin,但我不知道如何解决这个问题。我知道我可以form_choices通过指定元组列表来限制文本字段的可能值。无论如何,form_choices允许一次只选择一个值。如何指定在某些情况下我可能需要以逗号分隔的值列表?
我试过这个解决方法:
form_args = {
'FIELD': {
'render_kw': {"multiple": "multiple"},
}
}
Run Code Online (Sandbox Code Playgroud)
但是,即使网页上实际出现了多选输入,也只会保存第一个值。
EIDT 05/13/2017
通过使用flask-admin,我为我的问题找到了两种可能的(部分)解决方案,它们都有特定的缺点。
1)第一个处理使用 Select2TagsField
from flask_admin.form.fields import Select2TagsField
...
form_extra_fields = {
'muri': Select2TagsField()
}
Run Code Online (Sandbox Code Playgroud)
使用此方法可以轻松实现普通输入文本的选择菜单,即使目前我不明白如何将选项传递给 Select2TagsField。它可以很好地作为一种多自由文本输入。但是,据我所知,不可能配对 Select2TagsField 和 form_choices
2)第二个有点长,但它提供了对代码的更多控制(至少我认为)。仍然暗示使用form_choices,但这次与on_model_change
form_args = {
'FIELD': {
'render_kw': {"multiple": "multiple"},
}
}
form_choices = {'FIELD': [
('1', 'M1'), ('2', 'M2'), ('3', 'M3'), ('4', 'M4')
]}
...
def on_model_change(self, form, model, is_created):
if len(form.FIELD.raw_data) > 1:
model.FIELD = ','.join(form.FIELD.raw_data)
Run Code Online (Sandbox Code Playgroud)
尽管是前一种,但该解决方案允许映射选择并且在将数据添加到模型时运行良好,但在编辑时会出现一些问题。每当我打开编辑对话框时,FIELD 都是空的。如果我查看发送到表单的数据( …
有没有办法从Flask功能启动弹出窗口?
我有一个flask-admin+ flask-sqlalchemy应用程序.DB中的表包含foo具有某些值的字段.我有一个UserAdmin视图,我正在尝试使用一些外部参数创建批处理操作.即我想:
foo用一个新的用户定义值替换每个元素的旧值所以模型是:
class User(db.Model):
# some code
foo = Column(Integer)
def change_foo(self, new_foo):
self.foo = int(new_foo)
db.session.commit()
return True
class UserAdmin(sqla.ModelView):
# some code
@action('change_foo', 'Change foo', 'Are you sure you want to change foo for selected users?')
def action_change_foo(self, ids):
query = tools.get_query_for_ids(self.get_query(), self.model, ids)
count = 0
# TODO: pop-up modal window here to get new_foo_value
# new_foo_value = ???
for …Run Code Online (Sandbox Code Playgroud) 我正在将烧瓶管理员添加到预先存在的烧瓶样板项目中。我已经能够在https://github.com/kc1/flask-base (SCREENSHOT) 上运行基本项目。我现在需要添加模型视图来添加基本的 CRUD 功能。为此,我将代码更改为:
adm = Admin(app,name='flaskadmin')
from app.models import User
adm.add_view(ModelView(User, db.session))
Run Code Online (Sandbox Code Playgroud)
你可以看到它有效。但是如果我在 app/init 顶部导入 User 模型和其余的导入,我会得到:
Traceback (most recent call last):
File "...flask-base/manage.py", line 10, in <module>
from app import create_app, db
File "E:\ENVS\r3\flask-base\app\__init__.py", line 17, in <module>
from app.models import User
File "E:\ENVS\r3\flask-base\app\models\__init__.py", line 6, in <module>
from .user import * # noqa
File "E:\ENVS\r3\flask-base\app\models\user.py", line 7, in <module>
from .. import db, login_manager
ImportError: cannot import name 'db'
Run Code Online (Sandbox Code Playgroud)
为什么?
我的 SQLAlchemy 数据库中有三个表(使用 Flask SQLAlchemy):产品、产品变体和订单。我想在订单中查看包含哪些产品及其变体。
它适用于关系/外键,但主要问题是:如果我将产品添加到订单中,我仍然可以添加其他产品的变体(使用 Flask-Admin,或仅使用 Flask shell)。
所以,主要问题是:如何在表之间创建连接,以便只有当它们是订单产品的变体时才能添加变体?谢谢 :)
另一个解决方案:如何将列添加到 Orders 表,以便根据变体 ID 从 Product 表中获取产品名称?我尝试使用column_property, Post.query.get(variation_id), variation.parent_id, backhrefvariation.origin_product但没有任何成功:)
我的模型:
产品(如三星 Galaxy 7)
class Product(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(120), index=True)
brand = db.Column(db.String(120))
variations = db.relationship('Variation', backref='origin_product', lazy='dynamic')
orders = db.relationship('Order', backref='product_in_order', lazy='dynamic')
Run Code Online (Sandbox Code Playgroud)
产品变化(如三星 Galaxy 7 Blue 32GB)
class Variation(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(120), index=True)
price = db.Column(db.Integer)
product_id = db.Column(db.Integer, db.ForeignKey('product.id')) …Run Code Online (Sandbox Code Playgroud)