加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 带有弹出模式窗口参数的Flask-admin批处理操作

发布时间:2020-12-16 22:20:15 所属栏目:Python 来源:网络整理
导读:有没有办法从Flask功能启动弹出窗口? 我有一个flask-admin flask-sqlalchemy应用程序. DB中的表包含带有一些值的字段foo.我有一个UserAdmin视图,我正在尝试使用一些外部参数创建一个batch action. 我想: 从我的数据库中选择几个元素 使用一个新的用户定义

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

我有一个flask-admin flask-sqlalchemy应用程序. DB中的表包含带有一些值的字段foo.我有一个UserAdmin视图,我正在尝试使用一些外部参数创建一个batch action.
我想:

>从我的数据库中选择几个元素
>使用一个新的用户定义值替换每个元素的旧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 user in query.all():
            if user.change_foo(new_foo_value):
                count += 1
        flash(ngettext('Foo was successfully changed.','%(count)s foos were successfully changed.',count,count=count))
    except Exception as e:
        flash(ngettext('Failed to change foo for selected users. %(error)s',error=str(e)),'error')

我承认整个方法并不是最优的,所以我很高兴能得到更好的建议.

有一些相关的问题:?Batch Editing in Flask-Admin?(尚未答复)和?Flask-Admin batch action with form?(使用WTF表格的一些解决方法).

最佳答案
这是实现这一目标的一种方法.我把完整的自包含示例放在Github上,flask-admin-modal.

更新于2017年5月28日.另一位用户已经增强了Github项目,以便很好地处理表单验证.

在此示例中,SQLite数据库模型是具有名称(字符串)和成本(整数)属性的项目,我们将在Flask-Admin列表视图中更新所选行的成本值.请注意,Flask应用程序启动时,数据库将填充随机数据.

这是模型:

class Project(db.Model):
    id = db.Column(db.Integer,primary_key=True)
    name = db.Column(db.String(255),nullable=False,unique=True)
    cost = db.Column(db.Integer(),nullable=False)

    def __str__(self):
        return unicode(self).encode('utf-8')

    def __unicode__(self):
        return "Name: {name}; Cost : {cost}".format(name=self.name,cost=self.cost)

使用接受新成本的整数成本字段定义表单.此表单还有一个隐藏字段,用于跟踪选定的行ID.

class ChangeForm(Form):
    ids = HiddenField()
    cost = IntegerField(validators=[InputRequired()])

覆盖项目视图模型的列表模板.我们这样做,所以我们可以在{%block body%}内注入一个带有id changeModal的Bootstrap模态表单,确保我们先调用{{super()}}.

我们还添加了一个jQuery文档就绪函数,如果模板变量(change_modal)的计算结果为true,它将显示模态形式.在模态体中使用相同的变量来显示change_form.我们使用Flask-Admin lib宏render_form以Bootstrap样式呈现表单.

请注意render_form中action参数的值 – 它是我们在Project视图中定义的路径,我们可以在其中处理表单的数据.另请注意,“关闭”按钮已替换为链接,但仍设置为按钮.该链接是启动操作的原始URL(包括页面和过滤器详细信息).

{% extends 'admin/model/list.html' %}

{% block body %}
    {{ super() }}

    
                        

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读