标签: flask-admin

如何在模型类的Flask Admin视图中使字段不可编辑

我有一个User模型类,password是许多中的一个属性.我正在使用Flask Web框架和Flask-Admin扩展来创建我的模型类的管理视图.我想在管理视图中使某些字段像password不可编辑或根本不显示它们.我该怎么做?

我可以使字段不显示在普通视图中,但是当我单击表格中任何记录的编辑按钮时,所有字段都会显示并且可以编辑.

python flask flask-admin

7
推荐指数
3
解决办法
6242
查看次数

Flask-Admin自定义Select2 Ajax字段

我正在尝试在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)

javascript python ajax flask flask-admin

6
推荐指数
1
解决办法
1639
查看次数

在Flask-admin ModelView中对自定义字段进行筛选和排序

我想在模型视图中添加金额(自定义字段)的过滤器

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方法,排序很有效.有没有办法为量列添加标准过滤器(大于,小于).

python flask flask-admin

6
推荐指数
1
解决办法
1656
查看次数

自定义Flask-Admin表单,其中一些选择字段选项根据另一个选择字段设置

我正在尝试使用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 flask-admin

6
推荐指数
1
解决办法
4479
查看次数

Flask-Admin/Flask-SQLAlchemy:为INSERT设置user_id = current_user

使用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)

python flask-sqlalchemy flask-admin

6
推荐指数
1
解决办法
803
查看次数

Flask-Admin基于角色的访问 - 根据角色修改访问权限

我从这里获取了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)

python flask flask-admin

6
推荐指数
2
解决办法
5000
查看次数

flask-admin form_choices 中的多项选择

好吧,我最近接触了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

6
推荐指数
2
解决办法
4517
查看次数

通过弹出模式窗口参数的Flask-admin批处理操作

有没有办法从Flask功能启动弹出窗口?

我有一个flask-admin+ flask-sqlalchemy应用程序.DB中的表包含foo具有某些值的字段.我有一个UserAdmin视图,我正在尝试使用一些外部参数创建批处理操作.即我想:

  • 从我的DB中选择几个元素
  • 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)

python modal-dialog flask flask-admin

6
推荐指数
1
解决办法
1339
查看次数

导入错误:无法导入名称“db”

在此处输入图片说明

我正在将烧瓶管理员添加到预先存在的烧瓶样板项目中。我已经能够在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)

为什么?

python flask flask-admin

6
推荐指数
1
解决办法
1万
查看次数

Flask SQLAlchemy:如何添加依赖于另一个表的列?

我的 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)

python sqlalchemy flask flask-sqlalchemy flask-admin

6
推荐指数
1
解决办法
3357
查看次数