导入包html
from flask_admin import Admin,BaseView,expose,AdminIndexView from flask_admin.contrib.sqla import ModelView
最终效果图python
1、模型视图
1.管理新闻、管理公告、管理文件、管理展现栏是四个与数据库表同步的模型视图,若是你想要在后台管理程序中数据库中的表在初始化admin后仅需一句代码sql
admin = Admin(app)
admin.add_view(ModelView(User, db.session))
2.可是有时候flask-admin的默认设置并不能知足你的条件,若是咱们在后台只打算让表中固定的几列数据显示,这时候咱们就不能直接像上面那样直接ModelView,咱们需自定义一个类并继承ModelView,并重写一些代码,把想要显示出来的列名写在column_list中数据库
class MyV1(ModelView): column_list = ('id', 'title','timestamp','count','content') def __init__(self, session, **kwargs): super(MyV1, self).__init__(News, session, **kwargs)
而后在程序中再加入代码以下,而后就OK了flask
admin.add_view(MyV1(db.session,name = u'管理新闻'))
3.若是咱们使用flask作网站是给本身使用,后台和数据库中同步的列名是英文显示没有多大影响,本身写的数据库难道还不知道什么意思,可是当咱们是写给非技术人员使用时,他们可能不能理解每一个列名是什么意思,因此如今咱们就须要将列名中文化,也是须要重写column_labelssession
class MyV1(ModelView): column_labels = { 'id':u'序号', 'title' : u'新闻标题', 'timestamp':u'发布时间', 'count':u'浏览次数', 'content':u'新闻内容' } column_list = ('id', 'title','timestamp','count','content') def __init__(self, session, **kwargs): super(MyV1, self).__init__(News, session, **kwargs)
4.有时候当同步数据库表成功后,扩展会有一个默认新建数据插入数据库表中的功能,可是咱们有时候发表博客、新闻这些须要排版的文章可是默认的新建数据不支持这个功能怎么办,咱们能够把默认建立功能先关掉。app
class MyV1(ModelView): can_create = False column_labels = { 'id':u'序号', 'title' : u'新闻标题', 'timestamp':u'发布时间', 'count':u'浏览次数', 'content':u'新闻内容' } column_list = ('id', 'title','timestamp','count','content') def __init__(self, session, **kwargs): super(MyV1, self).__init__(News, session, **kwargs)
2、建立视图
上面咱们说到讲默认建立功能关掉,可是咱们怎么新建数据呢,咱们能够本身写一个视图,关联本身的模板,再在模板中集成富文本。post
class MyNews(BaseView): @expose('/', methods=['GET', 'POST']) def index(self): form = NameForm() return self.render('donews.html', form=form)
而后再程序中加入代码网站
admin.add_view(MyNews(name=u'发表新闻'))
3、对主页面的修改
flask-admin默认主页面标题是Home,并且界面一片空白,因为各类须要,咱们须要对这些进行更改,参考如下代码url
admin = Admin( app, index_view=AdminIndexView( name='导航栏', template='welcome.html', url='/admin' ) )
将标题修改成导航栏,并将主页设置为welcome.html,进入后台对应的url也能够修改
4、权限设置
通常后台并非对全部用户开放的,全部牵扯到了管理员权限,这一块我是依靠flask-login这个扩展实现的,关于flask-login会再写一遍进行总结,新加代码以下
class MyV1(ModelView): def is_accessible(self): if current_user.is_authenticated and current_user.username == "admin": return True return False can_create = False column_labels = { 'id':u'序号', 'title' : u'新闻标题', 'timestamp':u'发布时间', 'count':u'浏览次数', 'content':u'新闻内容' } column_list = ('id', 'title','timestamp','count','content') def __init__(self, session, **kwargs): super(MyV1, self).__init__(News, session, **kwargs)
class MyNews(BaseView): def is_accessible(self): if current_user.is_authenticated and current_user.username == "admin": return True return False @expose('/', methods=['GET', 'POST']) def index(self): form = NameForm() return self.render('donews.html', form=form)
经过判断当前用户登陆状态和当前登陆的用户名进行权限设置