筆者是看狗書入門的flask,狗書上對於flask-admin這個擴展並沒有進行講解,最近因為項目需要,學習使用flask-admin,瞬間體會到了flask開發的快速、擴展的強大
Flask-admin 使用經驗技巧總結
from flask_admin import Admin,BaseView,expose,AdminIndexView from flask_admin.contrib.sqla import ModelView
先把最終效果圖放上
一、模型視圖
1.管理新聞、管理公告、管理文件、管理展示欄是四個與數據庫表同步的模型視圖,如果你想要在后台管理程序中數據庫中的表在初始化admin后僅需一句代碼
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了
admin.add_view(MyV1(db.session,name = u'管理新聞'))
3.如果我們使用flask做網站是給自己使用,后台和數據庫中同步的列名是英文顯示沒有多大影響,自己寫的數據庫難道還不知道什么意思,但是當我們是寫給非技術人員使用時,他們可能不能理解每個列名是什么意思,所以現在我們就需要將列名中文化,也是需要重寫column_labels
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.有時候當同步數據庫表成功后,擴展會有一個默認新建數據插入數據庫表中的功能,但是我們有時候發表博客、新聞這些需要排版的文章但是默認的新建數據不支持這個功能怎么辦,我們可以把默認創建功能先關掉。
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)
二、創建視圖
上面我們說到講默認創建功能關掉,但是我們怎么新建數據呢,我們可以自己寫一個視圖,關聯自己的模板,再在模板中集成富文本。
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'發表新聞'))
三、對主頁面的修改
flask-admin默認主頁面標題是Home,而且界面一片空白,由於各種需要,我們需要對這些進行更改,參考以下代碼
admin = Admin( app, index_view=AdminIndexView( name='導航欄', template='welcome.html', url='/admin' ) )
將標題修改為導航欄,並將主頁設置為welcome.html,進入后台對應的url也可以修改
四、權限設置
一般后台並不是對所有用戶開放的,所有牽扯到了管理員權限,這一塊我是依靠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)
通過判斷當前用戶登錄狀態和當前登錄的用戶名進行權限設置
1,最粗暴的辦法,把site-packages/django/contrib/admin/templates/admin/base.html拷貝到你的項目目錄/templates/admin/base.html,然后修改href="你要的url"
2,在你的AdminSite對象中可以修改