目錄
- 一、BaseAdminObject 類
- 1.1 get_admin_url() 方法
- 1.2 get_form_params() 方法
- 1.3 get_model_perm() 方法
- 1.4 get_model_url() 方法
- 1.5 get_model_view() 方法
- 1.6 get_query_string() 方法
- 1.7 get_view() 方法
- 1.8 has_model_perm() 方法
- 1.9 message_user() 方法
- 1.10 render_response() 方法
- 1.11 static() 方法
- 1.12 template_response() 方法
- 二、BaseAdminPlugin 類
- 三、BaseAdminView 類
- 四、CommAdminView 類
- 4.1 get_breadcrumb() 方法
- 4.2 get_context() 方法
- 4.3 get_model_icon() 方法
- 4.4 get_nav_menu() 方法
- 4.5 get_site_menu() 方法
- 五、ModelAdminView 類
- 5.5 get_breadcrumb() 方法
- 5.2 get_context() 方法
- 5.3 get_model_perms() 方法
- 5.4 get_object() 方法
- 5.5 get_object_url() 方法
- 5.6 get_ordering() 方法
- 5.7 get_template_list() 方法
- 5.8 has_add_permission() 方法
- 5.9 has_change_permission() 方法
- 5.10 has_delete_permission() 方法
- 5.11 has_view_permission() 方法
- 5.12 model_admin_url() 方法
- 5.13 queryset() 方法
- 六、ListAdminView 類
- 6.1 get() 方法
- 6.2 get_check_field_url() 方法
- 6.3 get_context() 方法
- 6.4 get_list_display() 方法
- 6.5 get_list_display_links() 方法
- 6.6 get_list_queryset() 方法
- 6.7 get_media() 方法
- 6.8 get_model_method_fields() 方法
- 6.9 get_ordering() 方法
- 6.10 get_ordering_field() 方法
- 6.11 get_ordering_field_columns() 方法
- 6.12 get_page_number() 方法
- 6.13 get_paginator() 方法
- 6.14 get_response() 方法
- 6.15 get_result_list() 方法
- 6.16 init_request() 方法
- 6.17 make_result_list() 方法
- 6.18 post() 方法
- 6.19 post_response() 方法
- 6.20 post_result_list() 方法
- 6.21 result_header() 方法
- 6.22 result_headers() 方法
- 6.23 result_item() 方法
- 6.24 result_row() 方法
- 6.25 results() 方法
- 6.26 url_for_result() 方法
- 七、ModelFormAdminView 類
- 7.1 formfield_for_dbfield() 方法
- 7.2 get() 方法
- 7.3 get_context() 方法
- 7.4 get_error_list() 方法
- 7.5 get_field_attrs() 方法
- 7.6 get_field_style() 方法
- 7.7 get_form_helper() 方法
- 7.8 get_form_layout() 方法
- 7.9 get_media() 方法
- 7.10 get_model_form() 方法
- 7.11 get_readonly_fields() 方法
- 7.12 instance_forms() 方法
- 7.13 post() 方法
- 7.14 prepare_form() 方法
- 7.15 save_forms() 方法
- 7.16 save_models() 方法
- 7.17 save_related() 方法
- 7.18 setup_forms() 方法
- 7.19 valid_forms() 方法
- 八、CreateAdminView 類
- 8.1 get_breadcrumb() 方法
- 8.2 get_context() 方法
- 8.3 get_form_datas() 方法
- 8.4 get_response() 方法
- 8.5 post_response() 方法
- 九、UpdateAdminView 類
- 9.1 get_breadcrumb() 方法
- 9.2 get_context() 方法
- 9.3 get_form_datas() 方法
- 9.4 get_response() 方法
- 9.5 post_response() 方法
- 十、DeleteAdminView 類
- 10.1 delete_model() 方法
- 10.2 get() 方法
- 10.3 get_breadcrumb() 方法
- 10.4 get_context() 方法
- 10.5 init_request() 方法
- 10.6 post() 方法
- 10.7 post_response() 方法
- 十一、DetailAdminView 類
- 11.1 get() 方法
- 11.2 get_breadcrumb() 方法
- 11.3 get_context() 方法
- 11.4 get_field_result() 方法
- 11.5 get_form_helper() 方法
- 11.6 get_form_layout() 方法
- 11.7 get_media() 方法
- 11.8 get_model_form() 方法
- 11.9 get_response() 方法
- 11.10 init_request() 方法
- 十二、filter_hook() 方法
- 十三、csrf_protect_m() 方法
一、BaseAdminObject 類
BaseAdminView 和 BaseAdminPlugin 的基類, 提供一些通用的方法。
1.1 get_admin_url() 方法
get_admin_url(name, *args, **kwargs)
一個快捷的方法, 通過 name 參數能夠獲取到 url 的方法, AdminSite.app_name 的 url namespace 將會被添加。
1.2 get_form_params() 方法
get_form_params(new_params=None, remove=None)
向當前請求添加一個參數, 或者從當前請求中刪除一個參數, 並且生成 hidden input。 這個方法用來放入 HTML 的 form 中。
參數:
- new_params: 要新加的參數, 該參數爲 dict
- remove: 要刪除的參數, 該參數爲 list 或 tuple
1.3 get_model_perm() 方法
get_model_perm(model, name)
用來獲取一個指定 Model 的權限, 看下面這個例子:
>>> view.get_model_prem(User, 'view')
>>> 'auth.user_view'
1.4 get_model_url() 方法
get_model_url(model, name, *args, **kwargs)
一個快捷的方法, 通過傳入的 model 和 name 參數來獲取 url, 會自動生成 urlname, 並加上 AdminSite.app_name 的 namespace。
1.5 get_model_view() 方法
get_model_view(view_class, model, *args, **kwargs)
獲取 ModelAdminViewClass 的實例對象。 首先通過 AdminSite 獲取到相應的 OptionClass model, 然後調用 get_view 方法。
參數:
- view_class: ModelAdminViewClass 的類
- model: 綁定的 Model 類
1.6 get_query_string() 方法
get_query_string(new_params=None, remove=None)
依據原始的查詢字符串生成一個新的查詢字符串。
參數:
- new_params: 要新加的參數, 該參數爲 dict
- remove: 要刪除的參數, 該參數爲 list 或 tuple
1.7 get_view() 方法
get_view(view_class, option_class=None, *args, **kwargs)
獲取 AdminViewClass 的實例對象。 實際上, 它是通過調用 xadmin.sites.AdminSite.get_view_class
方法來工作的。
參數:
- view_class: AdminViewClass 的類
- option_class: 希望與 AdminViewClass 合併的 OptionClass
1.8 has_model_perm() 方法
has_model_perm(model, name, user=None)
檢查當前用戶是否具有某個 Model 的某些權限, 舉個例子:
>>> view.has_model_perm(User, 'view')
>>> True
1.9 message_user() 方法
message_user(message, level='info')
給用戶發送一條信息。 默認使用 django.contrib.messages
來完成消息的發送。
1.10 render_response() 方法
render_response(content, response_type='json')
一個快捷方法, 用來生成一個 HttpResponse 的實例。 如果 response_type
被設置爲 “json”, 結果將會被轉換成 json 的格式然後發送出去。
1.11 static() 方法
static(path)
xadmin.util.static
的一個快捷方法, 用來返回靜態文件的 url。
1.12 template_response() 方法
template_response(template, context)
創建 TemplateResponse 實例對象的快捷方法。
二、BaseAdminPlugin 類
它是所有插件類的基類, 繼承於 BaseAdminObject 類。 關於插件的註冊與使用詳見 xadmin.sites.AdminSite.register_plugin
方法。 關於插件原理, 請參考 filter_hook() 方法。
2.1 filter_hook() 方法
filter_hook(func)
具有此裝飾器的 AdminView 方法可以被插件類擴展, 並且會被按下面的步驟執行:
-
從實例中取出插件屬性, 並取出具有同樣方法名的插件;
-
按插件的
priority
進行排序; -
按序執行插件方法, 並遵循如下規則:
-
如果沒有給插件方法傳入參數, AdminView 方法的返回值不爲空, 會拋出異常;
-
如果傳給插件方法的第一個參數是 “" 表明這個參數是 AdminView 方法。 可以在 AdminView 方法執行前通過調用 "()” 來執行這個插件方法, 這樣就能做一些我們想做的事情。
def get_context(self, _):
c = {'key': 'value'}
c.update(_())
return c
- 如果傳給插件方法的第一個參數不是 “_”, 則 AdminView 方法將會被執行, 它的返回值將做爲一個參數傳入;
- 最後, 將插件按序執行的結果返回;
2.2 init_request() 方法
init_request(*args, **kwargs)
這是插件類的初始化方法, 是創建完插件後第一個被調用的方法。 通過這個方法, 插件需要的屬性就會被初始化完成, 並且檢查當前請求是否需要加載插件實例。 舉一個實現 Ajax 請求插件的例子:
def init_request(self, *args, **kwargs):
return bool(self.request.is_ajax() or self.request.REQUEST.get('_ajax'))
如果返回的是 False, 相關的 AdminView 實例不會加載插件。
三、BaseAdminView 類
這是所有 AdminView 類的基類, 它繼承於 BaseAdminObject 和 django.views.generic.View
。
Xadmin 框架的核心類, 所有的 AdminView 類需要繼承於這個類。 Xadmin 和 Django Admin 最明顯的區別是每一個請求將導致一個 AdminView 類的實例被創建, 也是基於 class 的 view 方式, 在 Django 1.3 中實現。 可以參考 Django 官方文檔 Class-based generic views https://docs.djangoproject.com/en/1.4/topics/class-based-views/。
基於 class 的 view 有很多的好處。 首先, 無論何時進來請求, 都會創建一個具有當前請求的相關變量的實例來響應。 當擴展一個類或重寫父類方法時, 這種方式很有用。
其次, 基於 class 的 view 方式很容易去實現一個插件方法或動態加載插件, 因爲每一個 AdminView 實例需要根據自身情況加載一些指定的插件, 詳情參見 BaseAdminPlugin 類。
實現一個定製化的 AdminView 類是非常簡單的, 舉例如下:
from xadmin.sites import site
from xadmin.views import BaseAdminView
class MyAdminView(BaseAdminView):
def get(self, request, *args, **kwargs):
pass
site.register_view(r'^me_test/$', MyAdminView, name='my_test')
這樣您就可以通過 my_test/
來訪問這個視圖了。 同時, Xadmin 提供了一些通用的 AdminView 類, 它們是:
-
CommAdminView 類: 通用用戶界面的基本 view, 提供 Xadmin 通用用戶界面(比如目錄)需要的數據;
-
ModelAdminView 類: 核心類中的一個, 提供基於 Model 的 AdminView 類;
3.1 as_view() 類方法
as_view()
此方法重寫了 View.as_view() 方法, 並且在內部集成了 View.dispatch() 方法。 一些初始化的工作已經移除了, 通過 AdminView 類的是初始化方法來完成。 詳見 BaseAdminView.init_request() 方法。
3.2 get_context() 方法
@filter_hook
def get_context(*args, **kwargs):
...
返回展示請求頁面需要的 context 對象。
3.3 get_media() 方法
@filter_hook
def get_media(*args, **kwargs):
...
檢索生成 CSS 和 JS 文件所需的 Media 對象。
3.4 init_plugin() 方法
init_plugin(*args, **kwargs)
這是 AdminView 類的插件初始化方法, 會在 BaseAdminView.init_request() 方法執行後再執行。 所有 base_plugin 屬性中的插件都會按序進行初始化, 並且按 BaseAdminPlugin.init_request() 方法的結果進行按需加載。 如果插件是被需要的, 它將被保存爲 plugins 屬性。
3.5 init_request() 方法
init_request(*args, **kwargs)
它被設計爲讓子類進行重寫以進行初始化操作的方法, 並且對 BaseAdminView 類的初始化沒有任何實質性的影響。
四、CommAdminView 類
class xadmin.views.CommAdminView(request, *args, **kwargs)
它是繼承於 BaseAdminView 類的一個通用 AdminView 類。 可以通過這個類來進行全局的 Xadmin 站點設置, 包括:
-
站點的標題
-
全局的 Model 圖標
-
站點的菜單
View 屬性:
site_title=None 站點的標題
site_footer=None 網站的下角標文字
global_models_icon={} 全局的 Model 圖標 global_models_icon = {User: "user-icon"}
base_template='xadmin/base_site.html' View 模板繼承的基礎模板
default_model_icon=None 默認的 Model 圖標
4.1 get_breadcrumb() 方法
@filter_hook
def get_breadcrumb():
...
4.2 get_context() 方法
@filter_hook
def get_context(*args, **kwargs):
Context 參數:
-
site_title: 通過一個字符串來設置站點的標題, 默認爲 “Django Xadmin”
-
nav_menu: 在過濾完用戶權限後, 它將保存系統菜單選項。 如果在非 debug 模式下, 這個屬性將緩存在 SESSION 中
4.3 get_model_icon() 方法
@filter_hook
def get_model_icon(*args, **kwargs):
...
可以用來獲取 Model 的圖標, 圖標實際上是 css 類。 生成的 HTML 如下所示:
<i class="icon-model icon-{{ model_icon }}"></i>
這個例子應用的是 BootStrap 圖標的標準格式。 Xadmin 目前使用的是 Font Icon(Font Awesome), 你可以定製自己的圖表。 請參考 http://fortawesome.github.com/Font-Awesome/#contribute 來創建定製化的字體和圖標。
小貼士:
Model 圖標目前被使用在如下的幾個地方, 當然你也可以在你的定製化頁面中使用:
-
系統菜單
-
列表頁面的標題中
-
創建、 更新、 刪除頁面的標題中
常見問題解答: 如何定義 Model 圖標?
答: 一個全局的 Model 圖標可以在 CommAdminView 類的 OptionClass 中的 global_models_icon
屬性中進行設置。 或者設置 Models 中的 OptionClass 的 model_icon
屬性。
4.4 get_nav_menu() 方法
@filter_hook
def get_nav_menu(*args, **kwargs):
...
該方法返回網站的菜單。 如果 get_site_menu()
方法的返回值不爲 None, 則返回值將被作爲菜單的第一部分, Xadmin 將會添加 Model 列表的菜單項作爲後續菜單部分。 如果 get_site_menu()
方法的返回值爲 None, Xadmin 會根據 APP 和 Model 自動生成兩級菜單。
返回值類型: 格式見 get_site_menu()
的返回格式
4.5 get_site_menu() 方法
get_site_menu()
常見問題解答: 如何定製化系統菜單?
答: 子類用來重寫和實現定製化網站菜單的方法。 開發者可以通過子類或 OptionClass 重寫該方法。
({
"title": "菜單標題", "perm": "權限標示",
"icon": "圖標的 css class", "url": "菜單url",
"menus": [...] # 子菜單項
})
如果基於 Model, 菜單中的 perm
和 url
可以通過 BaseAdminObject.get_model_perm() 和 BaseAdminObject.get_model_url() 兩個快捷方法來提供。
舉個例子:
class AdminSettings(object):
def get_site_menu(self):
return (
{'title': '內容管理', 'perm': self.get_model_perm(Article, 'change'), 'menus':(
{'title': '遊戲資料', 'icon': 'info-sign', 'url': self.get_model_url(Article, 'changelist') + '?_rel_categories__id__exact=2'},
{'title': '網站文章', 'icon': 'file', 'url': self.get_model_url(Article, 'changelist') + '?_rel_categories__id__exact=1'},
)},
{'title': '分類管理', 'perm': self.get_model_perm(Category, 'change'), 'menus':(
{'title': '主要分類', 'url': self.get_model_url(Category, 'changelist') + '?_p_parent__isnull=True'},
{'title': '遊戲資料', 'url': self.get_model_url(Category, 'changelist') + '?_rel_parent__id__exact=2'},
)},
)
site.register(CommAdminView, AdminSettings)
五、ModelAdminView 類
class xadmin.views.ModelAdminView(request, *args, **kwargs)
這是一個基於 Model 的 AdminView 類。 AdminSite 實例將爲每個註冊了的 Model 類自動創建一個擴展了 ModelAdminView 類的子類的 url。 詳情參見 API 文檔中的方法, 或者看下面這個例子:
from xadmin.views import ModelAdminView
class TestModelAdminView(ModelAdminView):
def get(self, request, obj_id):
pass
site.register_modelview(r'^(.+)/test/$', TestModelAdminView, name='%s_%s_test')
當它註冊後, 用戶就可以通過 /%(app_label)s/%(module_name)s/123/test
路徑訪問到這個視圖。
Option 屬性:
-
fields=None: 類型爲列表或元組, 它定義了將要展示的字段;
-
exclude=None: 類型爲列表或元組, 它定義了編輯頁面不包含的字段;
-
ordering=None: 類型爲字典, 檢索 Model QuerySet 的默認排序;
-
model=None: 有界限的 Model 類, 當 Model 類註冊後它會自動分配給 OptionClass, 詳見 AdminSite 類的 register 方法。
實例屬性:
-
opts: 即 Model._meta
-
app_label: 即 Model._meta.app_label
-
module_name: 即 Model._meta.module_name
-
model_info: 即 (self.app_label, self.module_name)
5.5 get_breadcrumb() 方法
@filter_hook
def get_breadcrumb(*args, **kwargs):
...
5.2 get_context() 方法
@filter_hook
def get_context(*args, **kwargs):
...
Context 參數:
-
opts: Model 類的 _meta 屬性
-
app_label: Model 類的 app_label 屬性
-
module_name: Model 類的 module_name 屬性
-
verbose_name: Model 類的 verbose_name
5.3 get_model_perms() 方法
get_model_perms()
返回一個包含所有權限的字典, 該字典的 key 爲 “add”、 “view”、 “change” 和 “delete”, 值爲布爾類型, 表明當前用戶是否具有相應的權限。
5.4 get_object() 方法
@filter_hook
def get_object(*args, **kwargs):
...
通過 object_id 獲取唯一的 Model 實例。 如果 Model 的實例不存在則返回 None。
5.5 get_object_url() 方法
@filter_hook
def get_object_url():
...
5.6 get_ordering() 方法
get_ordering(self)
返回 Model 列表的 ordering, 默認就是返回 ModelAdminView.ordering,子類可以複寫該方法。
5.7 get_template_list() 方法
get_template_list(template_name)
根據 template_name 返回一個包含模板的列表。 新建頁面就是其中一個, 你可以輕鬆的重寫該方法來獲取定製化的模板。 列表的格式如下所示:
"xadmin/%s/%s/%s" % (opts.app_label, opts.object_name.lower(), template_name),
"xadmin/%s/%s" % (opts.app_label, template_name),
"xadmin/%s" % template_name,
5.8 has_add_permission() 方法
has_add_permission()
返回當前用戶是有具有添加權限。
5.9 has_change_permission() 方法
has_change_permission(obj=None)
返回當前用戶是否具有修改的權限。
5.10 has_delete_permission() 方法
has_delete_permission(obj=None)
返回當前用戶是否具有刪除的權限。
5.11 has_view_permission() 方法
has_view_permission(obj=None)
返回當前用戶是否具有視圖的權限。
小貼士:
在當前版本中, 如果一個用戶具有更新的權限, 則他也同時具有視圖的權限。 這個默認規則可以通過你的定製化子類去更改。
5.12 model_admin_url() 方法
model_admin_url(name, *args, **kwargs)
這個方法與 BaseAdminObject.get_admin_url 是一樣的, 期望使用從 ModelAdminView 類中繼承來的屬性, 因此, 模型參數不是必須的。
5.13 queryset() 方法
queryset()
返回 Model QuerySet。 可以用來查詢 Model 數據。
六、ListAdminView 類
class xadmin.views.ListAdminView(request, *args, **kwargs)
這是列表展示數據的 AdminView 類。 它實現了數據排序和分頁。
Option 屬性:
-
list_display=(‘str’, ): 默認展示的字段列表;
-
list_display_links=(): 顯示可編輯的數據詳情的連接列表;
-
list_select_related=None: 設置是否預先加載相關數據, 使用 select_related;
-
list_per_page=50: 每個頁面上展示數據記錄的數目;
-
list_max_show_all=200: 每個頁面上能夠展示數據記錄的最大值;
-
list_exclude=(): 展示中不包含的字段列表, 這個列表中包含不會在頁面中展示的字段;
-
search_fields=(): 使用這個屬性列出來的字段關鍵字來搜索數據;
-
ordering=None: 默認的數據排序規則;
-
object_list_template=None: 定義用來展示數據的模板;
6.1 get() 方法
@filter_hook
def get(*args, **kwargs):
...
展示 Model 列表。
6.2 get_check_field_url() 方法
get_check_field_url(f)
返回在 “顯示列” 的菜單項中每一項的 url。
6.3 get_context() 方法
@filter_hook
def get_context(*args, **kwargs):
...
Context 參數:
-
model_fields: 用來選擇顯示列功能, 定義能夠被展示的列表信息;
-
result_headers: 包含列表的頭部信息, 是 ResultHeader 類的實例;
-
results: 表格中每一行中的內容, 是 ResultItem 類的實例對象;
6.4 get_list_display() 方法
@filter_hook
def get_list_display(*args, **kwargs):
...
獲得展示用的字段, 如果請求中包含 “_cols”, 則使用該屬性, 否則使用 “list_display” 屬性。
小貼士:
該方法只用 “base_list_display” 屬性來保存 “list_display” 的值。 如果一些插件(比如 Action 插件)向該方法的返回值中增加了一些額外的值, 展示字段的數量會增加, 但是增加的數據不會對其他插件(比如 導出數據 插件)起作用。 這使得原始的展示字段數據能夠被分開保存, 開發者可以從 “base_list_display” 處檢索到原始數據。
6.5 get_list_display_links() 方法
@filter_hook
def get_list_display_links(*args, **kwargs):
...
向編輯頁面(如果當前用戶有編輯頁面的權限)或視圖頁面返回一組作爲鏈接展示的字段。 默認地, 如果該函數返回值不爲 None, 則使用 “list_display_links” 屬性值, 否則將使用 “list_display” 屬性的第一條數據。
6.6 get_list_queryset() 方法
@filter_hook
def get_list_queryset(*args, **kwargs):
...
獲得經過排序和過濾的 Model QuerySet, 並且其他插件可以修改這個 QuerySet。
6.7 get_media() 方法
@filter_hook
def get_media(*args, **kwargs):
...
返回 Model 對象, ListAdminView 使用 “xadmin.page.list.js” 的 JavaScript 文件。
6.8 get_model_method_fields() 方法
get_model_method_fields()
使用 “is_column” 屬性爲 True 的 OptionClass 類的方法返回值, 來組裝並展示一個字段。 這些方法通過 FakeMethodField 包裝成假的 DB field 用來展示。
6.9 get_ordering() 方法
@filter_hook
def get_ordering(*args, **kwargs):
...
返回更改列表的排序字段列表。 首先我們在 admin model 中檢查 get_ordering() 方法, 然後我們檢查對象的默認排序。 然後任何查詢字符串中手動指定的排序會覆蓋上面的排序。 最後, 通過確保主鍵作爲最後的排序字段來保證一個確定的順序。
6.10 get_ordering_field() 方法
@filter_hook
def get_ordering_field(*args, **kwargs):
...
從 “field_name” 參數獲取需要被排序的字段名稱, “field_name” 可以是標準的數據庫字段, 或者一個可執行方法或者 OptionClass 的 Model 屬性。 這種情況下, “admin_order_field” 屬性會被用來排序。 如果 “admin_order_field” 沒有值將返回 None。
class UserAdmin(object):
def my_field(self, obj):
return obj.name.lower()
my_field.admin_order_field = 'name'
6.11 get_ordering_field_columns() 方法
@filter_hook
def get_ordering_field_columns(*args, **kwargs):
...
返回一個排序字段列號和升序/降序的 SortedDict。
6.12 get_page_number() 方法
@filter_hook
def get_page_number(*args, **kwargs):
...
返回分頁組件的 HTML 頁碼, 默認使用 BootStrap。
參數:
- i: 頁碼, 可能是 DOT
6.13 get_paginator() 方法
@filter_hook
def get_paginator(*args, **kwargs):
...
使用 paginator_class 來實例化一個分頁對象並將其返回。
6.14 get_response() 方法
@filter_hook
def get_response(*args, **kwargs):
...
當執行完 “get_context” 方法後, 此方法默認無返回值, 但是可以利用插件來重寫這個方法並且返回指定的 HttpResponse 對象。
6.15 get_result_list() 方法
@filter_hook
def get_result_list(*args, **kwargs):
...
6.16 init_request() 方法
init_request(*args, **kwargs)
初始化請求, 首先檢查當前用戶是否具有 view 的權限, 然後進行一些生成數據列表所需的變量的初始化操作。
6.17 make_result_list() 方法
make_result_list()
爲視圖列表生成數據和分頁信息, 展示的數據被指定爲 “result_list” 屬性。 插件可以在這個方法執行過後來處理這些數據。
6.18 post() 方法
@filter_hook
def post(*args, **kwargs):
...
處理 Model 視圖列表的 POST 請求, 默認返回與 GET 請求相同的結果。 插件可以重寫 “post_response” 方法來改變 POST 請求的返回值。
6.19 post_response() 方法
@filter_hook
def post_response(*args, **kwargs):
...
此方法用來處理 POST 請求的響應, 默認返回 None。 插件可以重寫它來返回指定的 HttpResponse。
6.20 post_result_list() 方法
@filter_hook
def post_result_list(*args, **kwargs):
...
6.21 result_header() 方法
@filter_hook
def result_header(*args, **kwargs):
...
返回視圖列表中的某列頭部信息, 是一個 ResultHeader 類的實例。
參數:
-
field_name: 列的名字
-
row: ResultHeader 實例
6.22 result_headers() 方法
@filter_hook
def result_headers(*args, **kwargs):
...
返回視圖列表的頭部信息, 是一個 ResultRow 類的實例。 列信息被保存在 ResultRow 類的 cells 屬性中。
6.23 result_item() 方法
@filter_hook
def result_item(*args, **kwargs):
...
返回某個 Model 對象記錄的某個字段值, 是一個 ResultItem 實例。
參數:
-
obj: Model 對象
-
field_name: 列的名字
-
row: ResultHeader 實例
6.24 result_row() 方法
@filter_hook
def result_row(*args, **kwargs)):
...
返回一行用來展示的 Model 實例數據, 實際上是 ResultRow 類的實例。 ResultRow 的 cells 屬性包含了所有列的詳細信息。
6.25 results() 方法
@filter_hook
def results(*args, **kwargs):
...
返回視圖列表用來展示的全部數據, 和一個包含了所有行信息的 ResultRow 類的對象。
6.26 url_for_result() 方法
@filter_hook
def url_for_result(*args, **kwargs):
...
返回展示信息詳情的鏈接。 如果當前用戶具有更新的權限, 這個鏈接將被重定向到更新頁面, 否則將指向詳情頁面。
參數:
- result: Model 對象
七、ModelFormAdminView 類
class xadmin.views.ModelFormAdminView(request, *args, **kwargs)
這個 AdminView 類是基於 Model Form 來創建或更新數據的基類。 它提供通過 form 來展示或更新數據的方法。 CreateAdminView 類和 UpdateAdminView 類都繼承於這個類。
Option 屬性:
-
form=<class “django.forms.models.ModelForm”>: 參考於 Form 類, 用來基於 Model 類生成表單對象, 默認是 django.forms.ModelForm。
-
formfield_overrides={}: 指定一個 Form Field 類來重寫 Model Field, 比如:
class AtricleAdmin(object):
formfield_overrides = {
models.FileField:{'widget': mywidgets.XFileWidget},
}
這樣, mywidgets.XFileWidget 可以用來展示所有已經被定義的 FileField。
-
readonly_fields=(): 指定不能被編輯的只讀字段。
-
style_fields={}: 爲給定的字段指定一種樣式。 該樣式能夠對一個字段類型的展示產生不同的影響。 舉個例子, 單選按鈕可以有通用和內聯兩種樣式值。 Xadmin 能夠爲表單插件實現更多的 Field Style。 你可以通過設置一個已經定義的樣式值來使用一個確定的樣式。
-
relfield_style=None: 如果一個 model 被其他 model 引用時, 這個被引用的 model 可以應用 relfield_style 的值作爲 Field Style 來在其他 models 中展示。
-
save_as=False: 是否展示 “Save_as” 按鈕。
-
save_on_top=False: 是否在頁面的頂部展示一組按鈕。
-
add_form_template=None: 添加 model 的模板頁。
-
change_form_template=None: 更新 model 的模板頁。
-
form_layout=None: 這是 form layout 的對象, 也是一個 Crispy Form Layout 類的標準對象。 使用 Layout 可以輕鬆的定義頁面的結構。 詳情請參考 Crispy Form 的文檔: http://django-crispy-forms.readthedocs.org/en/latest/layouts.html。 這裏有一個 form_layout 的例子:
from xadmin.layout import Main, Side, Fieldset, Row, AppendedText
class AtricleAdmin(object):
form_layout = (
Main(
Fieldset('Comm data',
'title', 'category'
),
Inline(Log),
Fieldset('Details',
'short_title',
Row(AppendedText('file_size', 'MB'), 'author'),
'content'
),
),
Side(
Fieldset('Status',
'status',
),
)
)
關於 Layout 的元素信息請查閱 form_layout 的文檔。
7.1 formfield_for_dbfield() 方法
@filter_hook
def formfield_for_dbfield(*args, **kwargs):
...
處理生成 form 實例時的一個回調方法, 返回 Form Field 的實例。
參數:
- db_field: Model 的 DB Field
7.2 get() 方法
@filter_hook
def get(*args, **kwargs)
...
展示表單, 具體步驟如下所示:
-
調用 “prepare_form” 方法
-
調用 “instance_forms” 方法
- 調用 “get_form_datas” 方法
-
調用 “setup_forms” 方法
-
調用 “get_response” 方法
7.3 get_context() 方法
@filter_hook
def get_context(*args, **kwargs):
...
Context 參數:
-
form: 一個 Form 對象
-
original: 用於更新的原始數據對象
-
show_delete: 是否展示已經被刪除的項
-
add: 是否爲添加的數據
-
change: 是否是更新的數據
-
errors: form 的錯誤信息
7.4 get_error_list() 方法
@filter_hook
def get_error_list(*args, **kwargs):
...
獲取 form 的錯誤信息列表。
7.5 get_field_attrs() 方法
@filter_hook
def get_field_attrs(*args, **kwargs):
...
返回根據 model Field 屬性得來的包含 Form Field 屬性的字典。
參數:
- db_field: Model 的 DB Field
7.6 get_field_style() 方法
@filter_hook
def get_field_style(*args, **kwargs):
...
根據 Field Style 返回 Form Field 屬性。 此方法可通過插件來過濾, 提供不同的樣式。
參數:
-
db_field: Model 的 DB Field
-
style: 配置的 Field Style, 該值來自於屬性 style_fields
7.7 get_form_helper() 方法
@filter_hook
def get_form_helper(*args, **kwargs):
...
獲取 Crispy Form 需要的 FormHelper 實例。 詳情參見 Crispy Form 文檔。
7.8 get_form_layout() 方法
@filter_hook
def get_form_layout(*args, **kwargs):
...
返回 Form Layout 對象。 如果設置了 form_layout 屬性就返回該屬性, 否則返回自動生成的 Form Layout 對象。 更多的 Form Layout 信息參見 Crispy Form 文檔。 設置定製化的 Form Layout 對象是一種更靈活的方式來呈現表單中的每個元素。
7.9 get_media() 方法
@filter_hook
def get_media(*args, **kwargs):
...
7.10 get_model_form() 方法
@filter_hook
def get_model_form(*args, **kwargs):
...
返回用來展示表單的 ModelForm 對象。
7.11 get_readonly_fields() 方法
@filter_hook
def get_readonly_fields(*args, **kwargs):
...
返回只讀字段, 派生類或 OptionClass 可以重寫此方法。
7.12 instance_forms() 方法
@filter_hook
def instance_forms(*args, **kwargs):
...
利用 get_form_datas() 方法的返回值來實例化 Form 對象, 然後用 “form_obj” 屬性來保存這個對象。
7.13 post() 方法
@filter_hook
def post(*args, **kwargs):
...
保存表單數據。 具體執行步驟如下所示:
-
調用 “prepare_form” 方法
-
調用 “instance_forms” 方法
- 2.1 調用 “get_form_datas” 方法
-
調用 “setup_forms” 方法
-
“valid_forms” 方法
-
4.1 調用 “save_forms” 方法
-
4.2 調用 “save_models” 方法
-
4.3 調用 “save_related” 方法
-
4.4 調用 “post_response” 方法
7.14 prepare_form() 方法
@filter_hook
def prepare_form(*args, **kwargs):
...
通過調用 “get_model_form” 方法來比較 Form 類, 然後將其賦值給 “model_form” 屬性。
7.15 save_forms() 方法
@filter_hook
def save_forms(*args, **kwargs):
...
將 form 對象賦值給 “new_obj” 屬性, 請注意這個 model 對象並沒有保存到數據庫, 主鍵也沒有生成。
7.16 save_models() 方法
@filter_hook
def save_models(*args, **kwargs):
...
將數據保存到數據庫中相應的數據表。
7.17 save_related() 方法
@filter_hook
def save_related(*args, **kwargs):
...
保存相關的數據。
7.18 setup_forms() 方法
setup_forms()
創建一個 Form 類。
7.19 valid_forms() 方法
@filter_hook
def valid_forms(*args, **kwargs):
...
驗證 Form 數據的合法性。
八、CreateAdminView 類
class xadmin.views.CreateAdminView(request, *args, **kwargs)
此類是用來創建一個 model 對象的 AdminView 類, 繼承於 ModelFormAdminView 類。
8.1 get_breadcrumb() 方法
@filter_hook
def get_breadcrumb(*args, **kwargs):
...
8.2 get_context() 方法
@filter_hook
def get_context(*args, **kwargs):
...
Context 參數:
- title: 表單的標題
8.3 get_form_datas() 方法
@filter_hook
def get_form_datas(*args, **kwargs):
...
從請求中獲取到表單的初始化數據。
8.4 get_response() 方法
@filter_hook
def get_response(*args, **kwargs):
...
返回顯示錶單頁面的 Response, 子類或是 OptionClass 可以複寫該方法。
8.5 post_response() 方法
@filter_hook
def post_response(*args, **kwargs):
...
在成功保存 model 類到數據庫中後, 此方法返回一個 HttpResponse 對象或 HttPRedirectResponse 對象。
九、UpdateAdminView 類
class xadmin.views.UpdateAdminView(request, *args, **kwargs)
此類是一個用來更新 model 對象的 AdminView 類, 繼承於 ModelFormAdminView 類。
9.1 get_breadcrumb() 方法
@filter_hook
def get_breadcrumb(*args, **kwargs):
...
9.2 get_context() 方法
@filter_hook
def get_context(*args, **kwargs):
...
Context 參數:
-
title: 表單標題
-
object_id: 要更新的對象的 id
9.3 get_form_datas() 方法
@filter_hook
def get_form_datas(*args, **kwargs):
...
獲取一個 Form 對象數據。
9.4 get_response() 方法
@filter_hook
def get_response(*args, **kwargs):
...
9.5 post_response() 方法
@filter_hook
def post_response(*args, **kwargs):
...
當 model 對象被成功更新後, 返回一個 HttpResponse 對象或 HttpRedirectResponse 對象。
十、DeleteAdminView 類
class xadmin.views.DeleteAdminView(request, *args, **kwargs)
用來刪除 model 對象的 AdminView 類。
Option 屬性:
- delete_confirmation_template=None: 確認刪除的模板頁面
實例屬性:
- obj: 將要被刪除的 model 對象
10.1 delete_model() 方法
@filter_hook
def delete_model(*args, **kwargs):
...
刪除 “self.obj”
10.2 get() 方法
@filter_hook
def get(*args, **kwargs):
...
10.3 get_breadcrumb() 方法
@filter_hook
def get_breadcrumb(*args, **kwargs):
...
10.4 get_context() 方法
@filter_hook
def get_context(*args, **kwargs):
...
Context 參數:
-
title: 確認刪除的標題, 如果您沒有權限刪除的話, 會提示無法刪除
-
object: 將要被刪除的對象
-
deleted_objects: 關聯被刪除的所有數據對象
-
perms_lacking: 缺少的權限
-
protected: 被保護的數據, 該數據不能被刪除
10.5 init_request() 方法
init_request(object_id, *args, **kwargs)
進行初始化操作。 通過關鍵字 “object_id” 來檢索將要被刪除的對象, 並檢查當前用戶是否具有刪除的操作權限。
10.6 post() 方法
@filter_hook
def post(*args, **kwargs):
...
10.7 post_response() 方法
@filter_hook
def post_response(*args, **kwargs):
...
刪除成功後的處理。 首先通知用戶關於刪除的結果, 然後根據用戶的權限轉向相關的視圖。 如果用戶擁有視圖權限, 就轉向視圖頁面, 否則轉向 index 頁面。
十一、DetailAdminView 類
class xadmin.views.DetailAdminView(request, *args, **kwargs)
顯示 model 詳情的 AdminView 類。 視圖頁面僅用於視圖數據。 視圖佈局與 “xadmin.views.edit.ModelFormAdminView” 相同。
Option 屬性:
-
detail_layout=None: 詳情頁面的 Layout 對象是一個標準的 Crispy Form Layout 對象。 使用 Layout 的一個優勢是頁面佈局可以被更好的識別。
-
detail_show_all=True: 是否展示所有字段, 默認值爲 True。 如果此值被設置爲 True, 將展示那些沒有被設置爲 layout 對象的字段, 否則隱藏他們。
-
detail_template=None: 詳情視圖頁面的模板。
實例屬性:
- obj: 將要被刪除的 model 對象(【譯者注】個人認爲官網上這句是有問題的, 應該是 “用來展示詳情的 model 對象”, 但是官網上寫的是 “the model object that will be deleted”)
11.1 get() 方法
@filter_hook
def get(*args, **kwargs):
...
11.2 get_breadcrumb() 方法
@filter_hook
def get_breadcrumb(*args, **kwargs):
...
11.3 get_context() 方法
@filter_hook
def get_context(*args, **kwargs):
...
Context 參數:
-
form: 用來展示 model 對象數據的 form 對象
-
object: 用來展示的 model 對象
11.4 get_field_result() 方法
@filter_hook
def get_field_result(*args, **kwargs):
...
返回 ResultField 類的實例, 其中包含了字段內容。
11.5 get_form_helper() 方法
@filter_hook
def get_form_helper(*args, **kwargs):
...
獲取 Crispy Form 需要的 FormHelper 實例。 詳情參見 Crispy Form 文檔。
11.6 get_form_layout() 方法
@filter_hook
def get_form_layout(*args, **kwargs):
...
返回 Form Layout 對象, 如果設置了 “detail_layout” 屬性就返回它, 佛足額返回自動生成的 Form Layout 對象。 更多的關於 Form Layout 的信息參見 Crispy Form 文檔。 設置定製化的 Form Layout 對象會使呈現表中的每個項目變得更靈活。
11.7 get_media() 方法
@filter_hook
def get_media(*args, **kwargs):
...
返回當前視圖實例的 Model 對象, 其中包含了 “form.css” 的文件信息。
11.8 get_model_form() 方法
@filter_hook
def get_model_form(*args, **kwargs):
...
返回用來展示表單的 ModelForm 對象。
11.9 get_response() 方法
@filter_hook
def get_response(*args, **kwargs):
...
返回一個 HttpResponse 對象, 可以在插件中重寫該方法以返回指定的 HttpResponse 對象。
11.10 init_request() 方法
init_request(object_id, *args, **kwargs)
進行初始化的操作。 根據傳入的 “object_id” 參數來展示 model 對象數據。 將會檢查當前用戶的權限, 如果沒有視圖的權限, 視圖頁面將不會顯示。
十二、filter_hook() 方法
xadmin.views.filter_hook(func)
使用了這個裝飾器 AdminView 的方法可以被插件類擴展, 將會按照如下步驟執行:
-
從實例處獲取插件的屬性, 然後檢索插件類中同名的方法;
-
依據插件的 “priority” 屬性進行排序;
-
按順序執行插件的方法, 規則如下:
-
如果沒有給插件的方法傳入參數, 且 AdminView 方法沒有返回值將報出異常;
-
如果傳給插件方法的第一個參數是 “", 這個參數表示的是 AdminView 方法。 插件方法可以在 AdminView 方法之前, 以調用 "()” 的方式來執行。
def get_context(self, __):
c = {'key': 'value'}
c.update(__())
return c
- 如果傳入插件方法的第一個參數不是 “_”, AdminView 的方法將會被執行, 它的返回值將會作爲第一個參數傳入。
- 最後, 插件按序執行, 結果也將按序返回。
十三、csrf_protect_m() 方法
xadmin.views.csrf_protect_m(func)
此裝飾器使用與 CsrfViewMiddleware 相同的方式添加 CSRF 保護, 但是它可以在每個視圖基礎上使用。 同時使用這兩個裝飾器, 或者多次使用裝飾器既無害又有效。