入門
初始化
第一步是為Flask應用初始化一個空的管理界面:
from flask import Flask from flask_admin import Admin app = Flask(__name__) admin = Admin(app, name='microblog', template_mode='bootstrap3') # Add administrative views here app.run()
這里,name和template_mode參數都是可選的。或者,您可以使用該init_app()
方法。
如果您啟動此應用程序並導航到http:// localhost:5000 / admin /,您應該會在頂部看到一個帶有導航欄的空白頁面。
添加模型視圖
模型視圖允許您添加一組專用管理頁面,用於管理數據庫中的任何模型。通過創建ModelView類的實例來執行此操作,您可以從Flask-Admin的內置ORM后端之一導入該類。一個例子是SQLAlchemy后端,您可以按如下方式使用它:
from flask_admin.contrib.sqla import ModelView # Flask and Flask-SQLAlchemy initialization here admin = Admin(app, name='microblog', template_mode='bootstrap3') admin.add_view(ModelView(User, db.session)) admin.add_view(ModelView(Post, db.session))
開箱即用,這為您的模型提供了一組功能齊全的CRUD視圖:
- 一個列表視圖,用於搜索,排序,過濾和刪除記錄的支持。
- 一個創建視圖添加新記錄。
- 用於更新現有記錄的編輯視圖。
- 可選的只讀詳細信息視圖。
有許多選項可用於自定義這些內置視圖的顯示和功能。有關詳細信息,請參閱自定義內置視圖。有關可用的其他ORM后端的更多詳細信息,請參閱使用不同的數據庫后端。
向索引頁面添加內容
當你訪問http:// localhost:5000 / admin /時,你會注意到的第一件事 是它只是一個帶有導航菜單的空白頁面。要向此頁面添加一些內容,請在項目的templates目錄中將以下文本另存為admin / index.html:
{% extends 'admin/master.html' %} {% block body %} <p>Hello world</p> {% endblock %}
這將覆蓋默認索引模板,但仍會為您提供內置導航菜單。因此,現在您可以將任何內容添加到索引頁面,同時保持一致的用戶體驗。
對於更靈活的解決方案,Flask-Admin允許您通過簡單地覆蓋is_accessible方法來定義每個管理視圖類的訪問控制規則。您如何實現邏輯取決於您,但如果您使用像Flask-Login這樣的低級庫 ,則限制訪問可能非常簡單:
自定義內置視圖
內置的ModelView類非常適合快速入門。但是,您需要配置其功能以適合您的特定型號。這是通過設置ModelView類中可用的配置屬性的值來完成的。
要指定一些全局配置參數,可以將ModelView子類化,並在將模型添加到接口時使用該子類:
from flask_admin.contrib.sqla import ModelView # Flask and Flask-SQLAlchemy initialization here class MicroBlogModelView(ModelView): can_delete = False # disable model deletion page_size = 50 # the number of entries to display on the list view admin.add_view(MicroBlogModelView(User, db.session)) admin.add_view(MicroBlogModelView(Post, db.session))
或者,以同樣的方式,您可以一次為單個模型指定選項:
class UserView(ModelView): can_delete = False # disable model deletion class PostView(ModelView): page_size = 50 # the number of entries to display on the list view admin.add_view(UserView(User, db.session)) admin.add_view(PostView(Post, db.session))
ModelView配置屬性
有關已定義屬性的完整列表,請查看API文檔BaseModelView()
。以下是一些最常用的屬性:
要禁用某些CRUD操作,請設置以下任何布爾參數:
can_create = False can_edit = False can_delete = False
如果模型中有太多數據要顯示在列表視圖中,則可以通過設置添加只讀詳細信息視圖:
can_view_details = True
從列表視圖中刪除列很簡單,只需傳遞column_excludes_list參數的列名列表:
column_exclude_list = ['password', ]
為了使搜索欄,或將其用於過濾,指定列名的列表:
column_searchable_list = ['name', 'email'] column_filters = ['country']
要獲得更快的編輯體驗,請在列表視圖中啟用內聯編輯:
column_editable_list = ['name', 'last_name']
或者,在列表頁面的模態窗口中顯示添加和編輯表單,而不是專用的創建和編輯頁面:
create_modal = True edit_modal = True
您可以通過指定選擇選項列表來限制文本字段的可能值:
form_choices = { 'title': [ ('MR', 'Mr'), ('MRS', 'Mrs'), ('MS', 'Ms'), ('DR', 'Dr'), ('PROF', 'Prof.') ] }
要從創建和編輯表單中刪除字段:
form_excluded_columns = ['last_name', 'email']
要指定WTForms字段參數:
form_args = { 'name': { 'label': 'First Name', 'validators': [required()] } }
或者,指定用於呈現這些字段的WTForms小部件的參數:
form_widget_args = { 'description': { 'rows': 10, 'style': 'color: black' } }
當您的表單包含外鍵時,請通過ajax加載這些相關模型,使用:
form_ajax_refs = { 'user': { 'fields': ['first_name', 'last_name', 'email'], 'page_size': 10 } }
要過濾通過ajax加載的結果,您可以使用:
form_ajax_refs = { 'active_user': QueryAjaxModelLoader('user', db.session, User, filters=["is_active=True", "id>1000"]) }
要內聯管理相關模型:
inline_models = ['post', ]
這些內聯表單可以自定義。查看API文檔 inline_models()
。
要啟用模型視圖的csv導出:
can_export = True
這將向模型視圖添加一個按鈕,用於導出記錄,截斷為export_max_rows
。
添加自己的視圖
對於您的要求非常具體並且您很難通過內置ModelView
類來滿足它們的情況,Flask-Admin使您可以輕松地完全控制並將自己的視圖添加到界面中。
獨立視圖
可以通過擴展BaseView
類並定義自己的視圖方法來添加一組獨立視圖(不依賴於任何特定模型) 。例如,要添加顯示來自第三方API的某些分析數據的頁面:
from flask_admin import BaseView, expose class AnalyticsView(BaseView): @expose('/') def index(self): return self.render('analytics_index.html') admin.add_view(AnalyticsView(name='Analytics', endpoint='analytics'))
這將為您的視圖添加指向導航欄的鏈接。請注意,它以“/”(根URL)提供。這是對獨立視圖的限制:至少每個視圖類至少需要一個方法來在其根目錄下提供視圖。
上面示例的analytics_index.html模板可能如下所示:
{% extends 'admin/master.html' %} {% block body %} <p>Here I'm going to display some data.</p> {% endblock %}
通過擴展admin / master.html模板,您可以保持一致的用戶體驗,即使在嚴格控制頁面內容的同時也是如此。
覆蓋內置視圖
在某些情況下,您可能需要大多數內置的ModelView功能,但您希望替換默認的創建,編輯或列表視圖之一。為此,您只能覆蓋有問題的視圖,並且它的所有鏈接仍將按預期運行:
from flask_admin.contrib.sqla import ModelView # Flask and Flask-SQLAlchemy initialization here class UserView(ModelView): @expose('/new/', methods=('GET', 'POST')) def create_view(self): """ Custom create view. """ return self.render('create_user.html')
使用內置模板
Flask-Admin使用Jinja2模板引擎。
擴展內置模板
而不是完全覆蓋內置模板,最好擴展它們。這將使您以后升級到新的Flask-Admin版本變得更加簡單。
在內部,Flask-Admin模板派生自admin / master.html模板。您可以擴展的三個最有趣的模板:
- 管理/模型/ list.html
- 管理/模型/ create.html上
- 管理/模型/ edit.html
要使用您自己的功能擴展默認編輯模板,請在templates / microblog_edit.html中創建一個模板, 如下所示:
{% extends 'admin/model/edit.html' %} {% block body %} <h1>MicroBlog Edit View</h1> {{ super() }} {% endblock %}
現在,要使您的視圖類使用此模板,請設置適當的類屬性:
class MicroBlogModelView(ModelView): edit_template = 'microblog_edit.html' # create_template = 'microblog_create.html' # list_template = 'microblog_list.html'
如果要使用自己的基本模板,請在初始化期間將模板名稱傳遞給admin構造函數:
admin = Admin(app, base_template='microblog_master.html')
覆蓋內置模板
要完全控制管理界面的樣式和布局,您可以覆蓋所有內置模板。請記住,模板會從一個版本的Flask-Admin略微改變到下一個版本,所以一旦你開始覆蓋它們,你需要在升級包版本時要小心。
要覆蓋任何內置模板,只需將它們從Flask-Admin源復制到項目的templates / admin /目錄中。只要文件名保持不變,項目目錄中的模板應自動優先於內置模板。
可用的模板塊
Flask-Admin 在admin / master.html中定義了一個基本模板,其中包含所有其他管理模板。此模板是指向admin / base.html的代理,它定義了以下塊:
阻止名稱 | 描述 |
---|---|
head_meta | 標題中的頁面元數據 |
標題 | 頁面標題 |
head_css | 標題中包含各種CSS |
頭 | HTML頭中的空塊,以防你想在那里放東西 |
page_body | 頁面布局 |
牌 | 菜單欄中的徽標 |
主菜單 | 主菜單 |
menu_links | 鏈接菜單 |
訪問控制 | 菜單右側的部分(可用於添加登錄/注銷按鈕) |
消息 | 提醒和各種消息 |
身體 | 內容(顯示視圖的位置) |
尾巴 | 內容空白區域 |
除了從admin / master.html繼承的所有塊之外,admin / model / list.html模板還包含以下塊:
阻止名稱 | 描述 |
---|---|
model_menu_bar | 菜單欄 |
model_list_table | 表容器 |
list_header | 表頭行 |
list_row_actions_header | 動作標題 |
list_row | 單排 |
list_row_actions | 帶有編輯/刪除/等按鈕的行動單元格 |
empty_list_message | 如果找不到模型,將顯示的消息 |
請查看https://github.com/flask-admin/flask-admin/tree/master/examples/layout上的布局示例, 了解如何對管理界面進行完整的風格控制。
環境變量
在擴展admin / master.html的任何模板中工作時,您可以訪問少量環境變量:
變量名 | 描述 |
---|---|
admin_view | 當前的管理視圖 |
admin_base_template | 基本模板名稱 |
_gettext | Babel gettext |
_ngettext | Babel ngettext |
H | 來自helpers 模塊的助手 |
生成
要生成特定視圖的URL,請使用帶有點前綴的url_for:
from flask import url_for class MyView(BaseView): @expose('/') def index(self): # Get URL for the test view method user_list_url = url_for('user.index_view') return self.render('index.html', user_list_url=user_list_url)
還可以引用特定記錄:
# Edit View for record #1 (redirect back to index_view)
url_for('user.edit_view', id=1, url=url_for('user.index_view'))
引用ModelView實例時,在調用url_for時使用模型的小寫名稱作為前綴。可以通過為每個視圖指定唯一端點並將其用作前綴來引用其他視圖。所以,你可以使用:
url_for('analytics.index')
如果您的視圖端點定義如下:
admin.add_view(CustomView(name='Analytics', endpoint='analytics'))