Django Xadmin 官方文檔 之七 視圖

目錄

一、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 方法可以被插件類擴展, 並且會被按下面的步驟執行:

  1. 從實例中取出插件屬性, 並取出具有同樣方法名的插件;

  2. 按插件的 priority進行排序;

  3. 按序執行插件方法, 並遵循如下規則:

  • 如果沒有給插件方法傳入參數, AdminView 方法的返回值不爲空, 會拋出異常;

  • 如果傳給插件方法的第一個參數是 “" 表明這個參數是 AdminView 方法。 可以在 AdminView 方法執行前通過調用 "()” 來執行這個插件方法, 這樣就能做一些我們想做的事情。

def get_context(self, _):
    c = {'key': 'value'}
 	c.update(_())
 	return c
  • 如果傳給插件方法的第一個參數不是 “_”, 則 AdminView 方法將會被執行, 它的返回值將做爲一個參數傳入;
  1. 最後, 將插件按序執行的結果返回;

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, 菜單中的 permurl可以通過 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)
	...

展示表單, 具體步驟如下所示:

  1. 調用 “prepare_form” 方法

  2. 調用 “instance_forms” 方法

  • 調用 “get_form_datas” 方法
  1. 調用 “setup_forms” 方法

  2. 調用 “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):
	...

保存表單數據。 具體執行步驟如下所示:

  1. 調用 “prepare_form” 方法

  2. 調用 “instance_forms” 方法

  • 2.1 調用 “get_form_datas” 方法
  1. 調用 “setup_forms” 方法

  2. “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 的方法可以被插件類擴展, 將會按照如下步驟執行:

  1. 從實例處獲取插件的屬性, 然後檢索插件類中同名的方法;

  2. 依據插件的 “priority” 屬性進行排序;

  3. 按順序執行插件的方法, 規則如下:

  • 如果沒有給插件的方法傳入參數, 且 AdminView 方法沒有返回值將報出異常;

  • 如果傳給插件方法的第一個參數是 “", 這個參數表示的是 AdminView 方法。 插件方法可以在 AdminView 方法之前, 以調用 "()” 的方式來執行。

def get_context(self, __):
    c = {'key': 'value'}
    c.update(__())
    return c
  • 如果傳入插件方法的第一個參數不是 “_”, AdminView 的方法將會被執行, 它的返回值將會作爲第一個參數傳入。
  1. 最後, 插件按序執行, 結果也將按序返回。

十三、csrf_protect_m() 方法

xadmin.views.csrf_protect_m(func)

此裝飾器使用與 CsrfViewMiddleware 相同的方式添加 CSRF 保護, 但是它可以在每個視圖基礎上使用。 同時使用這兩個裝飾器, 或者多次使用裝飾器既無害又有效。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章