自定义Django Admin的action

在Django Admin中,可以通过action来自定义一些操作,其中默认的action的功能是选中多条数据来进行删除操作

我们在king_admin中也可以通过开发类似的功能性组件来实现自定义action

首先在king_admin中添加actions字段

actions = ['delete_selected_objs',] #和django admin一样,添加默认删除选中的多条记录的方法

在views视图中,获取前端页面传来的选中的记录id和action的函数名

  #post请求执行action操作
if request.method == 'POST':
selected_ids = request.POST.get('selected_ids')#获取选中记录的id
action_name = request.POST.get('action')#获取函数名
if selected_ids:
       #根据选中记录的id去数据库中获取记录
selected_objs = admin_class.model.objects.filter(id__in=selected_ids.split(','))
else:
raise KeyError('没有数据')
     #如果在admin_class中找到了该函数,则获取该函数,然后将admin_class,request和查询的记录传递到king_admin.py中的函数
if hasattr(admin_class,action_name):
action_func = getattr(admin_class,action_name)
request._action = action_name
return action_func(admin_class,request,selected_objs)

在king_admin.py中,获取这些参数,第一次调用时候,返回预删除页面,将值回填到预删除页面,当点击确认删除,此时delete_confrim值可获取到,

并且执行删除操作,执行完毕跳转到展示页

 def delete_selected_objs(self,request,query_set):
app_name = self.model._meta.app_label #获取app的名称
model_name = self.model._meta.model_name #获取表名
selected_ids = ','.join([str(i.id) for i in query_set]) #获取选中记录的id
if request.POST.get('delete_confirm') == 'yes':
       #当在待删除页面,点击确认删除的时候,delete_confirm才会有值,第一次进入该方法时,这里的值为空 
query_set.delete()
return redirect('/king_admin//%s/%s/' % (app_name,model_name))
#返回到待删除页面,传递的参数分别是(要删除的记录,admin_class,app名称,表名,选中的id,和要调用的方法)
#主要是为了点击确认删除时候,页面跳转到views中的方法,此时selected_id和action_name的值要回填,否则报错
return render(request,'king_admin/table_delete.html',{'model_obj':query_set,
'admin_class':self,
'app_name':app_name,
'table_name':model_name,
'selected_ids':selected_ids,
'action':request._action})

前端页面

作用: 1.在下拉列表中展示可调用的action

2.checkbox的多条数据删除和数据校验

<div class="row">
<form method="POST" onsubmit="return submitAction(this)">{% csrf_token %}
<div class="col-lg-2">
<select name="action" id="action_list" class="form-control" style="margin-top:20px">
<option value="">-----</option>
{% for action in admin_class.actions %}
<option value="{{ action }}">{% build_action_name admin_class action %}</option>
{% endfor %}
</select>
</div>
<div class="col-lg-2">
<button type="submit" class="btn" style="margin-top:20px;margin-left:-10px">执行</button>
</div>
</form>
</div>
<table class="table table-hover">
<thead>
<tr>
<th><input type="checkbox" onclick="checkAllToggle(this)"></th>
{% for column in admin_class.list_display %}
{# 动态展示表格中的数据,排序关键字,和筛选条件#}
{% build_table_header_column column orderby_key filter_conditions %}
{% endfor %}
</tr>
</thead>
<tbody>
{# <!--动态展示后端的表格中的数据--!>#}
{% for obj in query_sets %} <tr>
<td><input tag="obj_check" type="checkbox" value="{{ obj.id }}"/></td>
{% bulid_table_row request obj admin_class %}
</tr>
{% endfor %}
</tbody>
</table>

js部分

function checkAllToggle(ths){
//复选框全选,反选
if($(ths).prop('checked')){
$("input[tag='obj_check']").prop('checked',true);
}
else {
$("input[tag='obj_check']").prop('checked', false);
}
} function submitAction(ths){
//后台提交action所要的数据
selected_ids = [];
//将复选框选中的值放到列表中
$("input[tag='obj_check']:checked").each(function(){
selected_ids.push($(this).val());
});
//获取action的名字
var select_action = $('#action_list').val();
console.log(select_action)
if(selected_ids.length == 0){
alert('没有选择数据');
return;
}
if(!select_action){
alert('没有选择方法');
return;
} //添加已经选择的id,放到隐藏域中,一起提交到后台
var selected_id_ele = "<input name='selected_ids' type='hidden' value='"+selected_ids.toString()+"'/>";
$(ths).append(selected_id_ele);
return true;
}

预删除页面展示

在预删除页面,加入回填的参数,在点击确认删除时,获取king_admin中传递到前端的值,在把这些值第二次传递给后端的views中,此时views中会第二次调用

king_admin中的action的方法,同时获取到delete_confirm的值,执行删除操作,删除完毕后跳转首页

{% block container %}

    {% display_obj_related model_obj %}

    <form method="post">{% csrf_token %}
<input type="submit" class="btn btn-danger" value="确认删除">
<input type="hidden" value="yes" name="delete_confirm">
<input type="hidden" value="{{ selected_ids }}" name="selected_ids">
<input type="hidden" value="{{ action }}" name="action">
<a class="btn btn-info" href="{% url 'table_objs' app_name table_name %}">返回</a>
</form> {% endblock %}

最后一步,可以通过在action中自定义显示的函数名

class CustomerAdmin(BaseAdmin):
list_display = ['qq','name','source','consultant','consult_course','date','status']
list_filters = ['source','consultant','consult_course','status','date']
search_fields = ['qq','name','consultant__name']
list_per_page = 5
ordering = 'id'
filter_horizontal = ['tags',]
#继承父类中的action,每个类自定义的action
actions = ['delete_selected_objs','test',] def test(self,request,query_set):
print('test...')
#加上这条属性表示在action下拉框中展示此字段
test.display_name = '测试'

在tags中渲染

@register.simple_tag
def build_action_name(admin_class,action):
#获取admin_class的action对象
action_func = getattr(admin_class,action)
#如果有display_name就返回display_name的名称,否则就展示action字段
return action_func.display_name if hasattr(action_func,'display_name') else action

前端页面展示

<select name="action" id="action_list" class="form-control" style="margin-top:20px">
<option value="">-----</option>
{% for action in admin_class.actions %}
{# <!--自定义标签中去显示下拉框的名称--!>#}
<option value="{{ action }}">{% build_action_name admin_class action %}</option>
{% endfor %}
</select>

Python CRM项目六的更多相关文章

  1. Python CRM项目二

    一.准备工作 如果没有配置基本的项目,请参考 http://www.cnblogs.com/luhuajun/p/7771196.html 当我们配置完成后首先准备我们的app 创建2个app分别对应 ...

  2. Python CRM项目八

    自定义用户认证 目的:实现Django自定义的认证系统,在生产环境都是根据此代码进行定制的 步骤: 1.在settings文件中配置要使用的类 #命名规则 app名称.类名 AUTH_USER_MOD ...

  3. Python CRM项目一

    开发环境: 语言Python3.X以上 MTV WEB框架 Django 前端框架 jQuery+bootstrap 数据库 MySQL 运行环境 安装Python3.x 安装Django 除IE8以 ...

  4. Python CRM项目三

    1.分页: 分页使用Django内置的分页模块来实现 官方的分页案例 from django.core.paginator import Paginator, EmptyPage, PageNotAn ...

  5. python实践项目六:正则表达式-强口令

    描述:写一个函数,它使用正则表达式,确保传入的口令字符串是强口令.强口令的定义是:长度不少于8 个字符,  同时包含大写和小写字符, 至少有一位数字. 代码: #!/usr/bin/python # ...

  6. Python CRM项目七

    仿照Django Admin实现对readonly的字段进行设置 功能点: 1.页面不可进行更改 2.如果改变html代码中的值,则需要进行后端的数据库数据校验 3.可以对某些字段进行自定制校验规则 ...

  7. Python CRM项目四

    实现Django Admin的多对多的复选框效果 效果:左边显示的是未选中的字段,右边显示的是已选中的字段,两边点击的标签可以互相更换 首先在king_admin.py中增加filter_horizo ...

  8. crm项目开发之架构设计

    CRM customer relationship management 客户管理系统 1. 干什么用的? 管理客户 维护客户关系 2. 谁去使用? 销售 班主任 项目经理 3. 需求: 1. 登录 ...

  9. CRM项目总结

                CRM项目总结      一:开发背景 在公司日益扩大的过程中,不可避免的会伴随着更多问题出现. 对外 : 如何更好的管理客户与公司的关系?如何更及时的了解客户日益发展的需求变 ...

随机推荐

  1. 《SpringMVC从入门到放肆》二、SpringMVC的执行流程及默认配置

    上一篇博文我们做了一个hello world的程序,并且已经成功的跑起来了.这一篇我们来深入的了解一下SpringMVC的执行流程以及一些其它的配置. 一.执行流程 来解释一下上图中的各个名词1.Di ...

  2. Java与算法之(7) - 完全二叉树

    树 下图是一"棵"树的样子.树这个名称起的很形象,整个数据结构由根.枝.叶组成,其中1为根节点,2.3是1的子节点,4.5.6.8.9.10这几个没有子节点的节点称为叶节点. 节点 ...

  3. HDU1102(最小生成树Kruskal算法)

    Constructing Roads Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  4. java构建学生管理系统(一)

    用java搭建学生管理系统,重要还是对数据库的操作,诸如增删改查等. 1.基本的功能: 老师完成对学生信息的查看和修改,完成对班级的信息的概览. 学生可以看自己的成绩和对自己信息的修改. 学生和老师有 ...

  5. 设置Sql server用户对表、视图、存储过程、架构的增删改查权限

    根据数据库Schema限制用户对数据库的操作行为 授予Shema dbo下对象的定义权限给某个用户(也就是说该用户可以修改架构dbo下所有表/视图/存储过程/函数的结构) use [Your DB N ...

  6. mysql按照天统计报表,当天没有数据,填0

    1.问题复现: 按照天数统计每天的总数,如果其中有几天没有数据,那么group by 返回会忽略那几天,如何填充0?如下图,统计的10-3~10-10 7天的数据,其中只有8号和10号有数据,这样返回 ...

  7. 什么是命名空间?php命名空间的基本应用分享

    什么是命名空间? php中声明的函数名.类名和常量的名称,在同一次运行中是不能重复的,否则会产生一个致命的错误,常见的解决方法是约定一个前缀.例如 ,在项目开发时,用户 User 模块中的控制器和数据 ...

  8. 十二个 ASP.NET Core 例子——IOC

    目录 简单介绍 core自带IOC的实现解释 1.简单介绍 (个人理解) 是什么:IOC是一种设计原则,而非设计模式,是对流程控制,当你注入你需要的定制化类时,流程就确定了 怎么用:和IOC容器说你这 ...

  9. Oracle:对表的CREATE、ALTER、INSERT、RENAME、DELETE操作练习以及主外键约束

    -创建一个student表,设定表的主键为学号CREATE TABLE student( sno VARCHAR2(10) PRIMARY KEY, --列级约束 sno VARCHAR2(20) C ...

  10. DLL导出全局变量在多个DLL中调用

    =================================版权声明================================= 版权声明:原创文章 禁止转载  请通过右侧公告中的“联系邮 ...