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 保护, 但是它可以在每个视图基础上使用。 同时使用这两个装饰器, 或者多次使用装饰器既无害又有效。

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在 Django Xadmin 的列表视图中添加自定义按钮,可以使用 Xadmin 的 `ButtonPlugin` 插件。 以下是添加自定义按钮的步骤: 1. 创建一个 `ButtonPlugin` 子,例如: ```python from xadmin.plugins.utils import get_context_dict from xadmin.views import BaseAdminPlugin, ListAdminView class MyButtonPlugin(BaseAdminPlugin): # 定义按钮的图标和名称 my_btn_icon = 'fa fa-plus' my_btn_name = 'My Button' # 在页面右上角添加按钮 def get_context(self, __): context = get_context_dict(__) context['my_button_html'] = self.get_my_button_html() return context # 构建按钮的 HTML def get_my_button_html(self): return '<a class="btn btn-primary" href="#">' \ '<i class="{}"></i> {}</a>'.format(self.my_btn_icon, self.my_btn_name) ``` 2. 将 `ButtonPlugin` 子添加到 `ListAdminView` 中: ```python class MyListAdminView(ListAdminView): # ... # 注册自定义按钮插件 plugin_my_button = MyButtonPlugin # ... ``` 3. 在模板中添加按钮的 HTML: ```html {% extends "xadmin/base_site.html" %} {% load static %} {% block content %} {{ block.super }} <div class="row-fluid"> <div class="span12"> <div class="widget-box"> <div class="widget-title"> <h5>{{ title }} List</h5> <div class="buttons"> {{ my_button_html }} <!-- 添加自定义按钮的 HTML --> </div> </div> <div class="widget-content nopadding"> <!-- ... --> </div> </div> </div> </div> {% endblock %} ``` 这样,在列表视图页面的右上角就会出现一个名为 My Button 的自定义按钮。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值