效果图:

编辑按钮是默认的list_editable属性对应的插件(xadmin.plugins.editable)

放大按钮对应的是自定义插件。

自定义按钮源码:

xplugin.py(保证能够直接或者间接被adminx.py引用到即可)

# -*- coding:utf-8 -*-
import xadmin
from xadmin.views import BaseAdminPlugin, ListAdminView
from xadmin.views.edit import ModelFormAdminUtil
from xadmin.util import label_for_field
from django.utils.translation import ugettext as _ class CustomDetailPlugin(BaseAdminPlugin):
custom_details={} def __init__(self, admin_view):
super(CustomDetailPlugin, self).__init__(admin_view)
self.editable_need_fields = {} def init_request(self, *args, **kwargs):
active = bool(self.request.method == 'GET' and self.admin_view.has_view_permission() and self.custom_details)
if active:
self.model_form = self.get_model_view(ModelFormAdminUtil, self.model).form_obj
return active def result_item(self, item, obj, field_name, row):
if self.custom_details and item.field and (field_name in self.custom_details.keys()):
pk = getattr(obj, obj._meta.pk.attname)
field_label = label_for_field(field_name, obj,
model_admin=self.admin_view,
return_attr=False) item.wraps.insert(0, '<span class="editable-field">%s</span>')
title=self.custom_details.get(field_name,{}).get('title',_(u"Details of %s") % field_label)
default_load_url=self.admin_view.model_admin_url('patch', pk) + '?fields=' + field_name
load_url = self.custom_details.get(field_name,{}).get('load_url',default_load_url)
if load_url!=default_load_url:
concator='?' if load_url.find('?')==-1 else '&'
load_url=load_url+concator+'pk='+str(pk)
item.btns.append((
'<a class="editable-handler" title="%s" data-editable-field="%s" data-editable-loadurl="%s">'+
'<i class="fa fa-search"></i></a>') %
(title, field_name,load_url) ) if field_name not in self.editable_need_fields:
self.editable_need_fields[field_name] = item.field
return item # Media
def get_media(self, media):
if self.editable_need_fields:
media = media + self.model_form.media + \
self.vendor(
'xadmin.plugin.editable.js', 'xadmin.widget.editable.css')
return media
xadmin.site.register_plugin(CustomDetailPlugin, ListAdminView)

基本抄写了xadmin.plugins.editable的源码,并做少量修改。

1. 增加custom_details 字段 {字段名:{'title':自定义弹框标题, 'load_url':自定义弹框所加载的url地址},...}

  此url后续增加get参数: pk=n  , 一起被xadmin.plugin.editable.js做get方式的ajax读取,并将读取到的html赋值到弹框里面。

  因此自定义功能很大程度依赖于url对应的页面的实现。

2. 默认的编辑按钮改成了放大镜(可以提取为属性供adminx中的类自定义)

js/css都沿用原来的。并对 xadmin.plugin.editable.js做了少量阉割(注释以下两行代码,避免自定义icon被恢复为编辑图标)。

  Editpop.prototype.beforeToggle = function() {
var $el = this.$element if(this.content == null){
var that = this
//$el.find('>i').removeClass('fa fa-edit').addClass('fa-spinner fa-spin')
$.ajax({
url: $el.data('editable-loadurl'),
success: function(content){
//$el.find('>i').removeClass('fa-spinner fa-spin').addClass('fa fa-edit')
that.content = content
that.toggle()
},
dataType: 'html'
})
} else {
this.toggle()
}
}

备注:

自定义弹框原理:

ajax get方式加载url: cust_details[字段名]['load_url']?pk=n(n为对应模型实例的主键id)

将加载得到的html显示在弹出的窗体中。

应用示例

adminx.py

class SimCardPoolAdmin(object):
#...
custom_details={'card_in':{'title':u'xx明细', 'load_url':'detail2'}}

views.py (details2的试图&菜单注册)

# -*- coding:utf-8 -*-
from xadmin.sites import site
from xadmin.views.base import CommAdminView,csrf_protect_m
from django.template.response import TemplateResponse
from .models import * class CardPoolCardsView(CommAdminView):
#base_template = 'xadmin/base_site.html'
@csrf_protect_m
def get(self, request, *args, **kwargs):
pid = request.GET['pk']
pool_obj = SimCardPool.objects.get(id=pid)
card_objs=SimCardPhy.objects.filter(pool_no=pool_obj.pool_no)
data = [[{'x':x+1,'y':y+1,'v':0} for x in range(pool_obj.cols)] for y in range(pool_obj.rows)]
for c in card_objs:
data[c.row-1][c.col-1]['v']=1
import pdb #context = self.get_context()
context={'cp_details':data, 'rows':range(1,pool_obj.rows+1), 'cols':range(1,pool_obj.cols+1)}
#pdb.set_trace()
return TemplateResponse(self.request, [
'card_pool/cp_details.html'
], context, current_app=self.admin_site.name) site.register_view(r'^card_pool/simcardpool/detail2/$',CardPoolCardsView, name='cp_detail')

xadmin此版本貌似不能加载views.py,作为破解在 __init__.py中增加了 import views一行,如下:

__init__.py

import views
相关模板
<html>
<head>
<style type="text/css">
.in222{
background-color: green;
width: 14px;height: 14px;
float:left;
border:solid #add9c0; border-width:0px 1px 1px 0px;
}
.empty{
background-color: #eeeeff; border:1px #ff000 solid;
width: 14px;height: 14px;
float:left;
border:solid #add9c0; border-width:0px 1px 1px 0px;
}
</style>
</head>
<body>
<div style="border:solid 1px #add9c0; width:auto;text-align: center;display: inline-block;border-width:1px 0px 0px 1px;">
{% for row in cp_details %}
<div style="clear:left; float:left;width:auto;">
{% for o in row %}
{% if o.v %}
<div class="in222" title="(第{{o.y}}行,第{{o.x}}列)已插卡">&nbsp;</div>
{% else %}
<div class="empty" title="(第{{o.y}}行,第{{o.x}}列)未插卡" style="border:1px #ff000 solid">&nbsp;</div>
{% endif %}
{% endfor %}
</div>
{% endfor %}
</div>
</body>
</html>

最终效果:

转载请著明来自:http://www.cnblogs.com/Tommy-Yu/p/5443127.html,谢谢!

django xadmin 插件(3) 列表视图新增自定义按钮的更多相关文章

  1. django xadmin 插件(2) 列表视图新增一功能列

    以默认的related_link为例(即最后一列). 源码:xadmin.plugins.relate.RelatedMenuPlugin class RelateMenuPlugin(BaseAdm ...

  2. odoo14在列表视图里添加自定义按钮

    static/js/xxxx.js 这里定义按钮odoo.define('add.tree.view.buttons', function (require) { "use strict&q ...

  3. Qt之模型/视图(自定义按钮)

    简述 衍伸前面的章节,我们对QTableView实现了数据显示.自定义排序.显示复选框.进度条等功能的实现,本节主要针对自定义按钮进行讲解,这节过后,也希望大家对自定义有更深入的了解,在以后的功能开发 ...

  4. Qt 之模型/视图(自定义按钮)

    https://blog.csdn.net/liang19890820/article/details/50974059 简述 衍伸前面的章节,我们对QTableView实现了数据显示.自定义排序.显 ...

  5. jeecg Online表单开发中新增自定义按钮

    要求:给表单增加一个“确认”按钮,按钮功能更改选中数据的flag字段为1 点击“自定义按钮”,录入一个“确认”按钮 按钮编码:该编码在一个智能表单配置中唯一,该编码同时是按钮触发的JS函数名.例如:按 ...

  6. django xadmin插件 的基本用法 1

    1  安装或导入 xadmin 1 pip 安装 2 源码导入 在新建项目中新建extra_apps文件夹并将下载后的源码解压放入 (推荐,方便后续我们可以在源码中自定义一些插件的使用) 注: 具体可 ...

  7. django xadmin 插件(1)

    1. 插件的作用可以是全局的,也可以是只针对某个模型的.通过其 init_request控制是否加载此插件, demo如下: class SCPCardOverviewPlugin(BaseAdmin ...

  8. Qt之模型/视图(自定义按钮)(使用QStyleOption的子类进行drawControl,和我用的方法完全不一样)

    http://blog.csdn.net/liang19890820/article/details/50974059

  9. Qt之模型/视图(自定义按钮)(重绘QStyleOptionButton)

    http://blog.csdn.net/liang19890820/article/details/50974059#comments

随机推荐

  1. Python capitalize()方法

    Python capitalize()方法 capitalize()方法返回字符串的一个副本,只有它的第一个字母大写.对于8位的字符串,这个方法与语言环境相关. 语法 以下是capitalize()方 ...

  2. ecshop目录结构

    ECShop 最新程序 的结构图及各文件相应功能介绍ECShop文件结构目录┣ activity.php 活动列表┣ affiche.php 广告处理文件┣ affiliate.php 生成商品列表┣ ...

  3. ecshop登录

    邮箱登录 a.找到function login(){} ,增加一个邮箱判断is_mail()  , b.如果通过,增读取出username , c.再通过默认的login功能 1.需要修改文件incl ...

  4. SCI/EI期刊投稿 Reply Letter 常用格式总结

    SCI/EI期刊投稿Reply Letter常用格式总结          整个论文投稿的过程中,会遇到各种问题,需要我们向主编询问或是回复.下面主要总结了responses to the comme ...

  5. docker管理shipyard中文版v3.0.2更新

    shipyard中文版v3.0.2更新  https://console.dockerclub.net/ https://dockerclub.net/docs/intro/getting_start ...

  6. ] 解决myeclipse中新建javaweb工程,无法使用Web App Libraries问题

    ] 解决myeclipse中新建javaweb工程,无法使用Web App Libraries问题 标签: myeclipsejavawebWeb App Libraries 2013-10-16 1 ...

  7. JS之function的应用

    1.最基本的作为一个本本分分的函数声明使用. 复制代码代码如下: function func(){} 或 var func=function(){};  2.作为一个类构造器使用: 复制代码代码如下: ...

  8. Linux python <tab>自动补全

    为Python添加交互模式下TAB自动补全以及命令历史功能. 1.获取python目录 [root@localhost ~]# python Python 2.6.6 (r266:84292, Jul ...

  9. JS原型链理解

    1. 每个对象都有原型属性(__proto__)2. 对象的原型(__proto__)指向其构造函数(Class)的prototype属性3. 构造函数(Class)的prototype属性本身也是一 ...

  10. 在CentOS上安装ZooKeeper集群

    一共准备3个CentOS虚拟机 172.16.9.194 172.16.9.195 172.16.9.196 上传zookeeper-3.3.6.tar.gz到服务器并解压,3台服务器的目录结构如下 ...