Flask-Admin 增加自定义Action

Flask-Admin 增加自定义Action

Posted May 12, 2017

默认情况下, Flask Admin提供了两个Row Action, 即delete和edit. 但是大多数情况下, 这些并不能满足有其他快捷操作需求, 好在Flask Admin提供增加这种按钮的接口.

UserView.py

这是我原本的Admin ModelView实现, 很明显我没有对row actions做任务的定制.

Python

class UserView(ModelView):
    column_default_sort = ('active', False)
    column_list = ('name', 'email', 'active', 'roles')
    column_filters = ('name', 'active')
    form_create_rules = ('name', 'avatar', 'email', 'active', 'roles')

增加row action按钮

我们可以通过column_extra_row_actions属性增加row action.

Python

from flask_admin.model.template import EndpointLinkRowAction

class UserView(ModelView):
    column_default_sort = ('active', False)
    column_list = ('name', 'email', 'active', 'roles')
    column_filters = ('name', 'active')
    form_create_rules = ('name', 'avatar', 'email', 'active', 'roles')

    column_extra_row_actions = [
        EndpointLinkRowAction(
            'off glyphicon glyphicon-off',
            'user.activate_user_view',
        )
    ]

Flask-admin提供了row action的模版, 其中上面使用的EndpointLinkRowAction, 传入的是一个view(user.activate_user_view). 它是定义在UserView上的一个view方法(请看下面代码). 同时row action也有LinkRowAction类型, 它接受icon class和一个url. 另外它支持更多的类型, 请看这里:Github

增加对应的endpoint

在上面我们增加了一个EndpointLinkRowAction, 但是我们还没有定义动作具体的逻辑. 下面我们定义user.activate_user_view来接收这个动作的参数, 并实现相应的功能.

Python

class UserView(ModelView):
    column_default_sort = ('active', False)
    column_list = ('name', 'email', 'active', 'roles')
    column_filters = ('name', 'active')
    form_create_rules = ('name', 'avatar', 'email', 'active', 'roles')

    column_extra_row_actions = [
        EndpointLinkRowAction(
            'off glyphicon glyphicon-off',
            'user.activate_user_view',
        )
    ]

    @expose('/activate/', methods=('GET',))
    def activate_user_view(self):
        """
            Activate user model view. Only GET method is allowed.
        """
        return_url = get_redirect_target() or self.get_url('.index_view')

        id = request.args["id"]
        model = self.get_one(id)

        if model is None:
            flash(gettext('用户不存在'), 'error')
            return redirect(return_url)

        if model.active:
            flash(gettext('已经激活, 无需重复激活.'), 'warning')
            return redirect(return_url)

        model.active = True
        model.save()

        flash(gettext('已激活'), 'success')
        return redirect(return_url)

到此我们增加一个快速激活用户的方法就完成了.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏开源优测

AutoLine源码分析之开始篇

AutoLine开源平台是一个开源自动化测试解决方案,基于RobotFramework进行二次开发,支持RobotFramework几乎所有的库。

1222
来自专栏Golang语言社区

Golang语言社区--【游戏服务器知识】多线程并发

引言:上篇文章说到了多进程并发式的服务端模型,如上一篇文章所述,进程的频繁创建会导致服务器不堪负载,那这一篇博客主要讲述的是线程模型和线程池的方式来提高服务端的...

3374
来自专栏PHP在线

拒绝重复造轮子,用composer搞自己的框架(2)

久负盛名的 CodeIgniter 框架是很多人的 PHP 开发入门框架,同样也是我开始学习如何从头构建一个网站的框架。在 CI中我学到了很多,其中对 MVC ...

3779
来自专栏FreeBuf

挖洞经验 | 记一次有关参数指定型XSS的故事

各位信息安全大神们,大家好!我准备在这篇文章中跟大家分享一些我在最近一次挖洞过程中的发现,并与安全社区一同分享我的挖洞经验。 ? 写在前面的话 在这篇文章中,我...

27910
来自专栏高性能分布式系统设计

Go的PCRE包装在启用JIT的时候遇到的问题和解决方案

用CGO包装C的库, 如果启用了JIT的话,会有一些问题. 例如pcre用了JIT动态生成代码并JIT代码引用里自己线程的JIT Stack数据. 这时会有一个...

3017
来自专栏有趣的django

10.socket网络编程

套接字工作流程 ? 先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端...

3787
来自专栏社区的朋友们

深入浅出 Nodejs( 二 ):Nodejs 文件模块机制

本篇教程关于Nodejs的文件模块机制,具体讲CommonJs规范以及Nodejs文件模块的实现原理。

4912
来自专栏转载gongluck的CSDN博客

跟我一起写Makefile

makefile 介绍 make命令执行时,需要一个 makefile 文件,以告诉make命令如何去编译和链接程序。 首先,我们用一个示例来说明makefil...

3887
来自专栏用户2442861的专栏

跟我一起写Makefile:MakeFile介绍

http://wiki.ubuntu.org.cn/%E8%B7%9F%E6%88%91%E4%B8%80%E8%B5%B7%E5%86%99Makefile:...

1192
来自专栏程序员宝库

linux 常用指令

1.查看目录下有什么文件信息 ls //list查看当前目录下有什么文件 ls -l或ls ll //list -list 通过详...

3128

扫码关注云+社区

领取腾讯云代金券