django xadmin 插件(3) 列表视图新增自定义按钮

效果图:

编辑按钮是默认的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,谢谢!

时间: 2024-10-06 00:23:38

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

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

以默认的related_link为例(即最后一列). 源码:xadmin.plugins.relate.RelatedMenuPlugin class RelateMenuPlugin(BaseAdminPlugin): use_related_menu = True # ...若干删减 def related_link(self, instance): #... 若干删减 return '<div class="dropdown related_menu pull-right"

OpenERP-隐藏多对多域弹出列表视图的&quot;新建&quot;按钮(Hide the &quot;Create&quot; button from the popup list view of a many2many field)

隐藏多对多域的弹出列表视图中的"新建"按钮,如例: Hiding the "Create" button from the popup list view of a many2many field. Example shown as below: 1. 在.py文件中定义many2many的field: 1. Define a many2many field in the python source file 'a_m2m_field': fields.many2m

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

简述 衍伸前面的章节,我们对QTableView实现了数据显示.自定义排序.显示复选框.进度条等功能的实现,本节主要针对自定义按钮进行讲解,这节过后,也希望大家对自定义有更深入的了解,在以后的功能开发过程中,相信无论遇到什么样式形式,我们都可以很好地实现. 简述 效果 QStyledItemDelegate 源码 衍伸 效果 QStyledItemDelegate 源码 .h 包含显示按钮需要用到的智能指针,按钮的宽度.高度.按钮之间的间距.鼠标的坐标等. class TableViewDele

django xadmin 插件(1)

1. 插件的作用可以是全局的,也可以是只针对某个模型的.通过其 init_request控制是否加载此插件, demo如下: class SCPCardOverviewPlugin(BaseAdminPlugin): pool_overview=False#默认不加载此插件 def init_request(self, *args, **kwargs): return bool(self.pool_overview) xadmin.site.register_plugin(SCPCardOver

Ueditor 自定义按钮

第一步:找到ueditor文件夹下的ueditor.config.js下toolbars参数,新增一个字符串showmsg,同时新增一个labelMap用于鼠标移入显示自定义提示信息. //工具栏上的所有的功能按钮和下拉框,可以在new编辑器的实例时选择自己需要的从新定义 , toolbars: [[ ......,print', 'preview', 'searchreplace', 'help' //, 'drafts' 从草稿箱加载 //新增自定义按钮 ,'showmsg' ]] //自定

第三百九十六节,Django+Xadmin打造上线标准的在线教育平台—其他插件使用说

第三百九十六节,Django+Xadmin打造上线标准的在线教育平台-其他插件使用说 设置后台列表页面字段统计 在当前APP里的adminx.py文件里的数据表管理器里设置 aggregate_fields = {'字段名称':'sum为统计数,min为统计时间'} class CourseAdmin(object): # 自定义数据表管理器类 # 设置xadmin后台显示字段 list_display = ['name', 'desc', 'detail', 'degree', 'learn_

WorldWind源码剖析系列:插件列表视图类PluginListView和插件列表视图项类PluginListItem

WorldWind中的插件类是个庞大的类,可以说从软件设计层面上统筹可扩展的插件体系的设计思想是WorldWind中的精华,值得学习和借鉴.插件体系中的所用到的类可以分为两大类,一类是插件类Plugin及其派生类,另外一类是插件类中的界面类,如PluginDialog.PluginInstallDialog.插件列表视图类PluginListView和插件列表视图项类PluginListItem等.这些类之间的关联关系图如下所示.本节主要介绍插件类中的界面类. 插件列表视图类PluginList

第三百八十九节,Django+Xadmin打造上线标准的在线教育平台—列表筛选结合分页

第三百八十九节,Django+Xadmin打造上线标准的在线教育平台-列表筛选结合分页 根据用户的筛选条件来结合分页 实现原理就是,当用户点击一个筛选条件时,通过get请求方式传参将筛选的id或者值,传入逻辑处理就行数据库条件查询,将查询条件值在返回html页面判断是否是选中样式,最后将所有需要关联的筛选请求加上彼此逻辑处理传回来的查询条件值 html请求传参 黄色背景为请求传参 红色背景为逻辑处理传过来的查询条件判断样式 <div class="wp butler_list_box li

第三百九十七节,Django+Xadmin打造上线标准的在线教育平台—其他插件使用说,主题本地化设置

第三百九十七节,Django+Xadmin打造上线标准的在线教育平台-其他插件使用说,主题本地化设置 主题设置是在xadmin\plugins\themes.py这个文件 默认xadmin是通过下面这个json文件来动态加载的.所以我们可以到它加载的json文件里下载好主题 themes.py修改方式 #coding:utf-8 from __future__ import print_function import httplib2 from django.template import lo