Views¶
-
class
xadmin.views.BaseAdminObject[source]¶ 提供给
BaseAdminView和BaseAdminPlugin的通用基类,主要是提供了一些常用的通用方法-
get_admin_url(name, *args, **kwargs)[source]¶ 便捷方法,方便的通过 name 取得 url,会加上 AdminSite.app_name 的 url namespace
-
get_form_params(new_params=None, remove=None)[source]¶ 将当前 request 的参数,新加或是删除后,生成 hidden input。用于放入 HTML 的 Form 中。
Parameters: - new_params – 要新加的参数,该参数为 dict
- remove – 要删除的参数,该参数为 list, tuple
-
get_model_perm(model, name)[source]¶ 获取 Model 的某种权限标签,标签的格式为:
>>> view.get_model_perm(User, 'view') >>> 'auth.user_view'
-
get_model_url(model, name, *args, **kwargs)[source]¶ 便捷方法,方便的通过 model, name 取得 url,会自动拼成 urlname,并会加上 AdminSite.app_name 的 url namespace
-
get_model_view(view_class, model, *args, **kwargs)[source]¶ 获取 ModelAdminViewClass 的实例。首先通过
AdminSite取得 model 对应的 OptionClass,然后调用get_view()方法Parameters: - view_class – ModelAdminViewClass 的类
- model – 绑定的 Model 类
-
get_query_string(new_params=None, remove=None)[source]¶ 在当前的query_string基础上生成新的query_string
Parameters: - new_params – 要新加的参数,该参数为 dict
- remove – 要删除的参数,该参数为 list, tuple
-
get_view(view_class, option_class=None, *args, **kwargs)[source]¶ 获取 AdminViewClass 的实例。实际上就是调用
get_view_class()方法Parameters: - view_class – AdminViewClass 的类
- option_class – 希望与 AdminViewClass 合并的 OptionClass
-
has_model_perm(model, name, user=None)[source]¶ 判断当前用户是否有某个 Model 的 某种权限,例如:
>>> view.has_model_perm(User, 'view') >>> True
-
message_user(message, level='info')[source]¶ Send a message to the user. The default implementation posts a message using the django.contrib.messages backend.
-
-
class
xadmin.views.BaseAdminPlugin(admin_view)[source]¶ 所有 Plugin 的基类。继承于
BaseAdminObject。插件的注册和使用可以参看xadmin.sites.AdminSite.register_plugin(), 插件的原理可以参看filter_hook():-
filter_hook(func)¶ 表明 AdminView 的方法可以被插件插入的装饰器。执行使用了该装饰器的方法时,会按照以下过程执行:
首先将实例的 plugins 属性取出,取出含有同样方法名的插件
按照插件方法的
priority属性排序顺序执行插件方法,执行插件方法的规则:
如果插件方法没有参数,AdminView 方法的返回结果不为空则抛出异常
如果插件方法的第一个参数为
__,则 AdminView 方法将作为第一个参数传入,注意,这时还未执行该方法, 在插件中可以通过__()执行,这样就可以实现插件在 AdminView 方法执行前实现一些自己的逻辑,例如:def get_context(self, __): c = {'key': 'value'} c.update(__()) return c
如果插件方法的第一个参数不为
__,则执行 AdminView 方法,将结果作为第一个参数传入
最终将插件顺序执行的结果返回
-
-
class
xadmin.views.BaseAdminView(request, *args, **kwargs)[source]¶ 所有 AdminView 的基类。继承于
BaseAdminObject和django.views.generic.View该类是 xadmin 中 最核心 的类,所有的 AdminView 都需要继承此类。xadmin 与 Django Admin最大的区别就在于 xadmin 每次请求会产生一个 AdminView 的实例,也就是基于 Class 的 view 方式。该方式在 Django 1.3 被实现,可以参看 Django 的官方文档 Class-based generic views
使用 Class 的方式实现的好处显而易见。首先,每一次请求都会产生一个新的实例,这样 request 这种变量就可以保存在实例中,基类的扩展,或 是复写父类方法时再也不用带着 request 到处跑了,当然,除了 request 还有很多可以基于实例存储的变量。
其次,基于实例的方式非常方便的实现了插件功能,而且还能实现插件的动态加载,因为每个 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')
而后您就可以在
me_test/访问到该view了。当然xadmin同事提供了一些通用的 AdminView,分别为CommAdminView: xadmin通用界面的基础View,提供了xadmin通用界面需要的一些数据(菜单等)ModelAdminView: 核心类之一,提供了基于 Model 的 AdminView。
-
classmethod
as_view()[source]¶ 复写了
View.as_view()方法,主要是将View.dispatch()的也写到了本方法中,并且去掉了一些初始化操作, 因为这些初始化操作在 AdminView 的初始化方法中已经完成了,可以参看BaseAdminView.init_request()
-
init_plugin(*args, **kwargs)[source]¶ AdminView 实例中插件的初始化方法,在
BaseAdminView.init_request()后调用。根据 AdminView 中 的 base_plugins 属性将插件逐一初始化,既调用BaseAdminPlugin.init_request()方法,并根据返回结果判断是否加载该插件。 最后该方法会将初始化后的插件设置为 plugins 属性。
-
init_request(*args, **kwargs)[source]¶ 一般用于子类复写的初始化方法,在 AdminView 实例化时调用,
BaseAdminView的该方法不做任何操作。
-
class
xadmin.views.CommAdminView(request, *args, **kwargs)[source]¶ 基于
BaseAdminView提供的通用 AdminView。主要是完成了一些 xadmin 页面通用内容的处理。主要有:- 网站标题
- 全局的 Model 图标
- 网站菜单
View属性:
-
base_template= 'xadmin/base_site.html' View模板继承的基础模板
filter_hook
-
get_model_icon(model)[source]¶ filter_hook取得 Model 图标,Model 图标会作为 css class,一般生成 HTML 如下:
<i class="icon-model icon-{{model_icon}}"></i>
这是 Bootstrap 标准的图标格式,xadmin 目前是用了 Font Icon (Font-Awesome),您可以制作自己的图标,具体信息可以参考 如何制作自己的字体图标
Note
Model 图标,目前被使用在以下几个地方,当然您也可以随时使用在自己实现的页面中:
- 系统菜单
- 列表页面标题中
- 添加、修改及删除页面的标题中
FAQ: 如果定义 Model 图标您可以在
CommAdminView的 OptionClass 中通过CommAdminView.globe_models_icon属性设定全局的 Model 图标。 或者在 Model 的 OptionClass 中设置model_icon属性。
filter_hook返回网站菜单,如果
get_site_menu()返回的结果不是 None ,那么将把其返回结果作为菜单的第一部分,而后会补全没有出现的 Model 列表页菜单项, 如果get_site_menu()返回为 None, 那么将自动根据 App 和 Model 生成两级的菜单。Return type: 格式见 get_site_menu()返回格式
FAQ:如何定制系统菜单用于给子类复写的方法,开发者可以在子类或 OptionClass 中复写该方法,返回自己定义的网站菜单。菜单的格式为:
({ "title": "菜单标题", "perm": "权限标示", "icon": "图标的 css class", "url": "菜单url", "menus": [...] # 子菜单项 })
菜单项的
perm和url如果是基于 Model 的,可以使用 xadmin 提供的便利方法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)
-
global_models_icon= {} 全局的 Model 图标:
globe_models_icon = {User: ‘user-icon’}
-
site_footer= '我的公司' 网站的下角标文字
-
site_title= 'Xadmin' 网站的标题
-
class
xadmin.views.ModelAdminView(request, *args, **kwargs)[source]¶ 基于 Model 的 AdminView,该类的子类,在 AdminSite 生成 urls 时,会为每一个注册的 Model 生成一个 url 映射。 ModelAdminView 注册时使用
xadmin.sites.AdminSite.register_modelview()方法注册,具体使用实例可以参见该方法的说明,或参考实例: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访问到该viewOption 属性
实例属性
-
app_label= None 即 Model._meta.app_label
-
exclude= None (list,tuple) 排除的字段,主要用在编辑页面
-
fields= None (list,tuple) 默认显示的字段
filter_hook
-
get_context()[source]¶ filter_hookContext Params :
opts: Model 的 _metaapp_label: Model 的 app_labelmodule_name: Model 的 module_nameverbose_name: Model 的 verbose_name
-
get_model_perms()[source]¶ 返回包含 Model 所有权限的 dict。dict 的 key 值为:
addviewchangedelete, value 为 boolean 值,表示当前用户是否具有相应的权限。
-
get_object(object_id)[source]¶ filter_hook根据 object_id 获得唯一的 Model 实例,如果 pk 为 object_id 的 Model 不存在,则返回 None
-
get_ordering()[source]¶ 返回 Model 列表的 ordering, 默认就是返回
ModelAdminView.ordering,子类可以复写该方法
-
get_template_list(template_name)[source]¶ 根据 template_name 返回一个 templates 列表,生成页面是在这些列表中寻找存在的模板。这样,您就能方便的复写某些模板。列表的格式为:
"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,
-
has_view_permission(obj=None)[source]¶ 返回当前用户是否有查看权限
Note
目前的实现为:如果一个用户有对数据的修改权限,那么他就有对数据的查看权限。当然您可以在子类中修改这一规则
-
model= None 绑定的 Model 类,在注册 Model 时,该项会自动附在 OptionClass 中,见方法
AdminSite.register()
-
model_admin_url(name, *args, **kwargs)[source]¶ 等同于
BaseAdminObject.get_admin_url(),只是无需填写 model 参数, 使用本身的ModelAdminView.model属性。
-
model_info= None 即 (self.app_label, self.module_name)
-
model_name= None¶ 即 Model._meta.module_name
-
opts= None 即 Model._meta
-
ordering= None (dict) 获取 Model 的 queryset 时默认的排序规则
-
-
class
xadmin.views.ListAdminView(request, *args, **kwargs)[source]¶ 显示数据列表的 AdminView, 该 View 实现了基本的数据排序和分页等功能.
Option 属性
-
list_display= ('__str__',)¶ 默认显示列
-
list_display_links= ()¶ 显示修改或查看数据详情连接的列
是否提前加载关联数据, 使用
select_related
-
list_per_page= 50¶ 每页显示数据的条数
-
list_max_show_all= 200¶ 每页最大显示数据的条数
-
list_exclude= ()¶ 排除显示的列, 在显示列的设置中不会出现这些被排除的列
-
search_fields= ()¶ 按照这些列搜索数据
-
ordering= None¶ 默认的数据排序
-
object_list_template= None¶ 显示数据的模板
-
block_pagination(context, nodes, page_type='normal')[source]¶ Generates the series of links to the pages in a paginated list.
-
get_context()[source]¶ filter_hookContext Params :
model_fields: 用于选择显示列功能, 保存所有可显示的列信息result_headers: 显示列表的头部信息, 是ResultHeader列表results: 显示列表的内容信息, 是ResultItem列表
-
get_list_display()[source]¶ filter_hook获得列表显示的列. 如果 request 中有
_cols参数, 则使用该参数, 否则使用list_display.Note
该方法会赋值
base_list_display属性, 保存 list_display. 如果有插件修改了该方法的返回值 (例如: Action 插件), 可能会增加其他列. 但是这些列可能对其他插件没有意义(例如: 导出数据插件). 那么其他插件可以使用base_list_display这个属性, 取得最原始的显示列.
-
get_list_display_links()[source]¶ filter_hook返回一组列, 这些列的数据会以链接形式显示, 连接地址可能是数据修改页面(如果有修改权限), 或是查看页面. 默认情况下会使用
list_display_links, 如果list_display_links为空, 则返回list_display第一列.
-
get_list_queryset()[source]¶ filter_hook取得 Model 的 queryset, 该 queryset 已经进行排序和过滤过. 其他插件可以在这里修改 queryset
-
get_model_method_fields()[source]¶ 将所有 OptionClass 中含有
is_column=True的方法, 使用FakeMethodField包装成一个假 的 DB Field. 用于在选择显示列的功能中显示.
-
get_ordering()[source]¶ filter_hookReturns the list of ordering fields for the change list. First we check the get_ordering() method in model admin, then we check the object’s default ordering. Then, any manually-specified ordering from the query string overrides anything. Finally, a deterministic order is guaranteed by ensuring the primary key is used as the last ordering field.
-
get_ordering_field(field_name)[source]¶ filter_hook根据参数
field_name获取需要排序 Field 的名字.field_name可能是 Model 的一个标准 DB Field, 也有可能是可执行方法, 或是 OptionClass 及 Model 的一个属性, 这种情况下会取其admin_order_field属性 作为排序字段, 如果取不到, 则返回None. 例如:class UserAdmin(object): def my_field(self, obj): return obj.name.lower() my_field.admin_order_field = 'name'
-
get_ordering_field_columns()[source]¶ filter_hookReturns a OrderedDict of ordering field column numbers and asc/desc
-
get_page_number(i)[source]¶ filter_hook返回翻页组件各页码显示的 HTML 内容. 默认使用 bootstrap 样式
Parameters: i – 页码, 可能是 DOT
-
get_paginator()[source]¶ filter_hook返回 paginator 实例, 使用
paginator_class类实例化
-
get_response(context, *args, **kwargs)[source]¶ filter_hook在
get_context()之后执行. 该方法默认无返回内容, 插件可以复写该方法, 返回指定的 HttpResponse.
-
list_display= ('__str__',) 默认显示列
-
list_display_links= () 显示修改或查看数据详情连接的列
-
list_display_links_details= False¶ 点击列表连接后是否转到详情页面
-
list_exclude= () 排除显示的列, 在显示列的设置中不会出现这些被排除的列
-
list_max_show_all= 200 每页最大显示数据的条数
-
list_per_page= 50 每页显示数据的条数
-
list_select_related= None 是否提前加载关联数据, 使用
select_related
-
object_list_template= None 显示数据的模板
-
ordering= None 默认的数据排序
-
paginator_class¶ alias of
django.core.paginator.Paginator
-
post(request, *args, **kwargs)[source]¶ filter_hook显示 Model 列表的 POST 请求, 默认跟 GET 请求返回同样的结果, 插件可以通过复写
post_response()方法改变 POST 请求的返回
-
post_response(*args, **kwargs)[source]¶ filter_hook列表的 POST 请求, 该方法默认无返回内容, 插件可以复写该方法, 返回指定的 HttpResponse.
-
result_header(field_name, row)[source]¶ filter_hook返回某一列的头信息, 一个
ResultHeader实例.Parameters: - field_name – 列的名字
- row –
ResultHeader实例
-
result_item(obj, field_name, row)[source]¶ filter_hook返回某一对象某一列的数据,
ResultItem实例.Parameters: - obj – Model 对象
- field_name – 列的名字
- row –
ResultHeader实例
-
result_row(obj)[source]¶ filter_hook返回列表某一行的内容信息. 返回一个
ResultRow实例, 其cells属性包含各列内容信息Parameters: obj – Model 对象
-
search_fields= () 按照这些列搜索数据
-
-
class
xadmin.views.ModelFormAdminView(request, *args, **kwargs)[source]¶ 用于添加或修改数据的 AdminView,该类是一个基类,提供了数据表单显示及修改等通用功能,被
CreateAdminView及UpdateAdminView继承Option 属性
-
form= <class 'django.forms.models.ModelForm'>¶ 使用 Model 生成 Form 的基本 Form 类,默认为 django.forms.ModelForm
-
formfield_overrides= {}¶ 可以指定某种类型的 DB Field,使用指定的 Form Field 属性,例如:
class AtricleAdmin(object): formfield_overrides = { models.FileField:{'widget': mywidgets.XFileWidget}, }
这样,显示所有 FileField 字段时,都会使用
mywidgets.XFileWidget来显示
-
readonly_fields= ()¶ 只读的字段,这些字段不能被编辑
-
style_fields= {}¶ 指定 Field 的 Style, Style一般用来实现同一种类型的字段的不同效果,例如同样是 radio button,有普通及``inline``两种 Style。 通常 xadmin 针对表单的插件会实现更多的 Field Style。您使用这些插件后,只要方便的将想要使用插件效果的字段设置成插件实现的 Style 即可,例如:
class AtricleAdmin(object): style_fields = {"content": "rich-textarea"}
rich-textarea可能是某插件提供的 Style,这样显示content字段时就会使用该插件的效果了
-
relfield_style= None¶ 当 Model 是其他 Model 的 ref model 时,其他 Model 在显示本 Model 的字段时使用的 Field Style
-
save_as= False¶ 是否显示
另存为按钮
-
save_on_top= False¶ 是否在页面上面显示按钮组
-
add_form_template= None¶ 添加页面的模板
-
change_form_template= None¶ 修改页面的模板
-
form_layout= None¶ 页面 Form 的 Layout 对象,是一个标准的 Crispy Form Layout 对象。使用 Layout 可以方便的定义整个 Form 页面的结构。 有关 Crispy Form 可以参考其文档 Crispy Form 文档 设置 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
-
add_form_template= None 添加页面的模板
-
change_form_template= None 修改页面的模板
-
form alias of
django.forms.models.ModelForm
-
form_layout= None 页面 Form 的 Layout 对象,是一个标准的 Crispy Form Layout 对象。使用 Layout 可以方便的定义整个 Form 页面的结构。 有关 Crispy Form 可以参考其文档 Crispy Form 文档 设置 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
-
formfield_for_dbfield(db_field, **kwargs)[source]¶ filter_hook生成表单时的回调方法,返回 Form Field。
Parameters: db_field – Model 的 DB Field
-
formfield_overrides= {} 可以指定某种类型的 DB Field,使用指定的 Form Field 属性,例如:
class AtricleAdmin(object): formfield_overrides = { models.FileField:{'widget': mywidgets.XFileWidget}, }
这样,显示所有 FileField 字段时,都会使用
mywidgets.XFileWidget来显示
-
get(request, *args, **kwargs)[source]¶ filter_hook显示表单。具体的程序执行流程为:
-
2.1
get_form_datas() get_response()
-
get_context()[source]¶ filter_hookContext Params:
form: Form 对象original: 要修改的原始数据对象show_delete: 是否显示删除项add: 是否是添加数据change: 是否是修改数据errors: Form 错误信息
-
get_field_attrs(db_field, **kwargs)[source]¶ filter_hook根据 DB Field 返回 Form Field 的属性,dict类型。
Parameters: db_field – Model 的 DB Field
-
get_field_style(db_field, style, **kwargs)[source]¶ filter_hook根据 Field Style 返回 Form Field 属性。扩展插件可以过滤该方法,提供各种不同的 Style
Parameters: - db_field – Model 的 DB Field
- style – 配置的 Field Style,该值来自于属性
style_fields
-
get_form_helper()[source]¶ 取得 Crispy Form 需要的 FormHelper。具体信息可以参看 Crispy Form 文档
-
get_form_layout()[source]¶ filter_hook返回 Form Layout ,如果您设置了
form_layout属性,则使用该属性,否则该方法会自动生成 Form Layout 。 有关 Form Layout 的更多信息可以参看 Crispy Form 文档 设置 Form Layout 可以非常灵活的显示表单页面的各个元素
-
instance_forms()[source]¶ filter_hook实例化 Form 对象,即使用
get_form_datas()返回的值初始化 Form,实例化的 Form 对象赋值为form_obj属性
-
prepare_form()[source]¶ filter_hook准备 Form,即调用
get_model_form()获取 form ,然后赋值给model_form属性
-
readonly_fields= () 只读的字段,这些字段不能被编辑
-
relfield_style= None 当 Model 是其他 Model 的 ref model 时,其他 Model 在显示本 Model 的字段时使用的 Field Style
-
save_as= False 是否显示
另存为按钮
-
save_on_top= False 是否在页面上面显示按钮组
filter_hook保存关联数据
-
style_fields= {} 指定 Field 的 Style, Style一般用来实现同一种类型的字段的不同效果,例如同样是 radio button,有普通及``inline``两种 Style。 通常 xadmin 针对表单的插件会实现更多的 Field Style。您使用这些插件后,只要方便的将想要使用插件效果的字段设置成插件实现的 Style 即可,例如:
class AtricleAdmin(object): style_fields = {"content": "rich-textarea"}
rich-textarea可能是某插件提供的 Style,这样显示content字段时就会使用该插件的效果了
-
-
class
xadmin.views.CreateAdminView(request, *args, **kwargs)[source]¶ 创建数据的 ModeAdminView 继承自
ModelFormAdminView,用于创建数据。filter_hook
-
init_request(*args, **kwargs)[source]¶ 一般用于子类复写的初始化方法,在 AdminView 实例化时调用,
BaseAdminView的该方法不做任何操作。
-
class
xadmin.views.UpdateAdminView(request, *args, **kwargs)[source]¶ 修改数据的 ModeAdminView 继承自
ModelFormAdminView,用于修改数据。filter_hook
-
init_request(object_id, *args, **kwargs)[source]¶ 一般用于子类复写的初始化方法,在 AdminView 实例化时调用,
BaseAdminView的该方法不做任何操作。
-
post(request, *args, **kwargs)[source]¶ filter_hook保存表单数据。具体的程序执行流程为:
prepare_form()instance_forms()2.1
get_form_datas()setup_forms()valid_forms()
-
class
xadmin.views.DeleteAdminView(request, *args, **kwargs)[source]¶ 删除 Model 的 AdminView。主要用于删除数据
Option属性
-
delete_confirmation_template= None¶ 删除时确认删除页面的模板名称
实例属性
-
obj¶ 即将被删除的对象
-
delete_confirmation_template= None 删除时确认删除页面的模板名称
filter_hook
-
-
class
xadmin.views.DetailAdminView(request, *args, **kwargs)[source]¶ 显示 Model 详细信息的 AdminView. 该 View 页面只能用来查看数据内容, 不能用来修改数据. 该 View 显示各字段的布局跟
xadmin.views.edit.ModelFormAdminView一致.Option属性
实例属性
-
obj¶ 即将被删除的对象
-
detail_show_all= True 是否显示所有字段的内容, 默认为
True. 如果为True则会显示 Layout 中没有列出的字段, 否则会隐藏这些字段
-
detail_template= None 详情页面的模板文件
-
form¶ alias of
django.forms.models.ModelForm
filter_hook
-
get_form_helper()[source]¶ filter_hook取得 Crispy Form 需要的 FormHelper。具体信息可以参看 Crispy Form 文档
-
get_form_layout()[source]¶ filter_hook返回 Form Layout ,如果您设置了
detail_layout属性,则使用form_layout属性,如果都没有该方法会自动生成 Form Layout 。 有关 Form Layout 的更多信息可以参看 Crispy Form 文档 设置 Form Layout 可以非常灵活的显示页面的各个元素
-
-
class
xadmin.views.FormAdminView(request, *args, **kwargs)[source]¶ -
form¶ alias of
django.forms.models.ModelForm
filter_hook
-
init_request(*args, **kwargs)[source]¶ 一般用于子类复写的初始化方法,在 AdminView 实例化时调用,
BaseAdminView的该方法不做任何操作。
-
-
xadmin.views.filter_hook(func)[source]¶ 表明 AdminView 的方法可以被插件插入的装饰器。执行使用了该装饰器的方法时,会按照以下过程执行:
首先将实例的 plugins 属性取出,取出含有同样方法名的插件
按照插件方法的
priority属性排序顺序执行插件方法,执行插件方法的规则:
如果插件方法没有参数,AdminView 方法的返回结果不为空则抛出异常
如果插件方法的第一个参数为
__,则 AdminView 方法将作为第一个参数传入,注意,这时还未执行该方法, 在插件中可以通过__()执行,这样就可以实现插件在 AdminView 方法执行前实现一些自己的逻辑,例如:def get_context(self, __): c = {'key': 'value'} c.update(__()) return c
如果插件方法的第一个参数不为
__,则执行 AdminView 方法,将结果作为第一个参数传入
最终将插件顺序执行的结果返回
-
xadmin.views.csrf_protect_m(view_func)¶ This decorator adds CSRF protection in exactly the same way as CsrfViewMiddleware, but it can be used on a per view basis. Using both, or using the decorator multiple times, is harmless and efficient.