CRM客户关系管理系统(九) 第九章、filter_horizontal优化和kingadmin删除功能

第九章、filter_horizontal优化和kingadmin删除功能

9.1.filter_horizontal优化

(1)添加Choose ALL 和Remove ALL

 table_obj_change_component.html

 js代码

function MoveAllElements(from_id,to_id) {

        console.log( $("#"+from_id).children())
         $("#"+from_id).children().each(function () {
             MoveSelectedOption(this,to_id);
         })
    }

 (2)添加过滤框功能

 js代码

function FuzzSearch(ele){

        console.log($(ele).val())
        var search_text = $(ele).val().toUpperCase();
        $(ele).next().children().each(function () {
            if ( $(this).text().toUpperCase().search(search_text) != -1){
                $(this).show();
            }else {
                $(this).hide();
            }
        })

    }

 9.2.kingadmin对象删除功能开发

(1)kingadmin/urls.py

#删除
    url(r'^(\w+)/(\w+)/(\d+)/delete/$', views.table_obj_delete,name='obj_delete'),

(2) table_obj_change_component.html

(3)kingamdin/views.py

def table_obj_delete(request,app_name,model_name,obj_id):
    '''删除功能'''
    admin_class = site.enable_admins[app_name][model_name]
    obj = admin_class.model.objects.get(id=obj_id)

    return render(request,'kingadmin/table_obj_delete.html',locals())

(4)新建table_obj_delete.html

{#kingadmin/templates/kingadmin/table_obj_delete.html#}

{% extends 'kingadmin/index.html' %}
{% load kingadmin_tags %}

{% block right-content-container %}
    <h2 class="page-header">{% get_model_name admin_class %}</h2>
    <h4 class="page-header">删除{{ form_obj.instance }}</h4>

<div>
delete
{{ obj }}


</div>

{% endblock %}

删除的时候显示要被删除对象的所有关联对象

(5)kingadmin_tags.py

@register.simple_tag
def display_all_related_objs(obj):
    """
    显示要被删除对象的所有关联对象
    """
    ele = "<ul><b style='color:red'>%s</b>" % obj

    #获取所有反向关联的对象
    for reversed_fk_obj in obj._meta.related_objects:
        #获取所有反向关联对象的表名
        related_table_name =  reversed_fk_obj.name
        # 通过表名反向查所有关联的数据
        related_lookup_key = "%s_set" % related_table_name
        related_objs = getattr(obj,related_lookup_key).all()
        ele += "<li>%s<ul> "% related_table_name
        #get_internal_type(),获取字段的类型,如果是m2m,就不需要深入查找
        if reversed_fk_obj.get_internal_type() == "ManyToManyField":  # 不需要深入查找
            for i in related_objs:
                ele += "<li><a href='/kingadmin/%s/%s/%s/change/'>%s</a> 记录里与[%s]相关的的数据将被删除</li>" \
                       % (i._meta.app_label,i._meta.model_name,i.id,i,obj)
        #如果不是m2m,就递归查找所有关联的数据
        else:
            for i in related_objs:
                ele += "<li><a href='/kingadmin/%s/%s/%s/change/'>%s</a></li>" %(i._meta.app_label,
                                                                                 i._meta.model_name,
                                                                                 i.id,i)
                #递归查找
                ele += display_all_related_objs(i)

        ele += "</ul></li>"

    ele += "</ul>"

    return ele

(6)table_obj_change_component.html

 (7)table_obj_delete.html

{#kingadmin/templates/kingadmin/table_obj_delete.html#}

{% extends 'kingadmin/index.html' %}
{% load kingadmin_tags %}

{% block right-content-container %}
    <h2 class="page-header">{% get_model_name admin_class %}</h2>
    <h3 class="page-header alert alert-danger">你确定要删除吗?{{ form_obj.instance }}</h3>

<div>
delete {{ obj }}

{% display_all_related_objs obj as all_related_obj_eles %}
{{ all_related_obj_eles|safe }}

<form method="post">
    {% csrf_token %}
    <input type="submit" class="btn btn-danger" value="确认删除">
    <a class="btn btn-info" >返回</a>

</form>
</div>
{% endblock %}

 删除的时候会提示所有关联对象

修改分页(设置默认显示多少条数据)

kingamdin/admin_base.py

class BaseKingAdmin(object):

    list_display = []
    list_filter = []
    search_fields = []
    #只读
    readonly_fields = []
    filter_horizontal = []
    list_per_page = 5

kingadmin/views.py

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

Golang语言--【基础知识】访问数据库

对许多Web应用程序而言,数据库都是其核心所在. 数据库几乎可以用来存储你想查询和修改的任何信息,比如用户信息、产品目录或者新闻列表等。 Go没有内置的驱动支持...

4476
来自专栏进击的程序猿

php异常处理 之 BooBoo库介绍

本文介绍php开源库BooBoo,是一个处理php异常和错误的开源库,通过简单的分析代码,我们知道了实际项目中怎么正确的设置错误和异常。

1002
来自专栏技术记录

Netty-Websocket 根据URL路由,分发机制的实现

最近在做netty整合websocket,发现网上很多项目都是最简单的demo,单例的一个项目。 然而公司的项目需要接受几个不同功能的ws协议消息,因此最好是用...

9275
来自专栏耕耘实录

一分钟在Linux环境下创建一台SFTP服务器(含账户创建)

FTP是比较常见的一种服务了,很多公司都会有可能使用到FTP服务器,本文将以最简洁的办法使用系统自带的ssh软件在1分钟内搭建一台使用方便的FTP服务器。 ...

1643
来自专栏python学习路

八、线程和进程 什么是线程(thread)?什么是进程(process)? 线程和进程的区别?Python GIL(Global Interpreter Lock)全局解释器锁

什么是线程(thread)? 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一...

4627
来自专栏鸿的学习笔记

DBDB: 一个简单的key/value数据库(三)

前文点击链接:DBDB: 一个简单的key/value数据库(一) 前文点击链接:DBDB: 一个简单的key/value数据库(二)

1042
来自专栏闻道于事

Java之线程,常用方法,线程同步,死锁

1, 线程的概念 进程与线程 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程。(进程是资源分配的最...

3469
来自专栏JavaEdge

操作系统之文件管理

将文件属性从外存拷到内存中打开文件表的一表目中 将其编号返回给用户。 系统可利用该编号到打开文件表中去查找。

35610
来自专栏Laoqi's Linux运维专列

tcpdump详解

3323
来自专栏问天丶天问

Java代码远程操作oracle数据库,执行sql文件、备份、回滚

3632

扫码关注云+社区

领取腾讯云代金券