導入包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)
經過判斷當前用戶登陸狀態和當前登陸的用戶名進行權限設置