django 实现的组织架构树

最近有需求要在项目中实现一个可以维护组织架构和人员的列表的组织树,然后网上搜了很多,使用ztree这个js树插件http://www.ztree.me/v3/api.php实现项目的需求,还不是很完善

首先,引入第一段地址和html中的容器:

<link href="{{STATIC_URL}}zTree/css/zTreeStyle/zTreeStyle.css" media="all" rel="stylesheet" type="text/css" />
<script src="{{STATIC_URL}}zTree/js/jquery.ztree.core-3.5.js" type="text/javascript"></script>
<script type="text/javascript" src="{{STATIC_URL}}zTree/js/jquery.ztree.excheck-3.5.js"></script>
<script type="text/javascript" src="{{STATIC_URL}}zTree/js/jquery.ztree.exedit-3.5.js"></script>

<ul id="treeDemo" class="ztree">      
 </ul>

将数据加载进去

  $(document).ready(function(){
      $.ajax({
            url: '/operators/{{user_id}}/config/get_all_groups',
            data: {},
            success: function(date,res){
                var zNodes = date
                $.fn.zTree.init($("#treeDemo"), setting, zNodes);
            },
            dataType: 'json'
        });
     
    });
models.py

class GroupInfo(models.Model):
    name = models.CharField(max_length = 128)#组织名
    fid = models.IntegerField(max_length = 10, db_index = True) #组织架构的父ID

    class Meta:
        app_label = 'account' 
        unique_together = (('name', 'fid'),)

class UserGroup(models.Model):
    user = models.ForeignKey(User)
    group = models.ForeignKey(GroupInfo)

    class Meta:
        app_label = 'account' 
        unique_together = (('user', 'group'),)

user_group_view.py

def __get_group(fid):
    groups = GroupInfo.objects.filter(fid = fid)
    group_infos = [{'name':k.name,'id':k.id} for k in groups]
    return group_infos

@render_to_json()
def get_all_groups(request,user_id):
    groups = []
    group_info_1st = __get_group(0)#调用上面的函数,得到第一级组织架构的名字(一级组织)和id
   
    for k in group_info_1st:
        k['open'] = True
        k['icon'] = '/static/img/group.png'#自定义的图标
        k['children'] = []
        k['children'] = [{'type':'user','name':user.user.first_name,'id':user.user.id,'pId':k['id'],'icon':'/static/img/person.png'} for user in UserGroup.objects.filter(group__id = k['id'])]
        group_info_2ed = __get_group(k['id'])
        for i in group_info_2ed:
            i['icon'] = '/static/img/group.png'#自定义的图标
            i['children'] = [{'type':'user','name':user.user.first_name,'id':user.user.id,'pId':i['id'],'icon':'/static/img/person.png'} for user in UserGroup.objects.filter(group__id = i['id'])]
            groups_info_3id = __get_group(i['id'])
            for j in groups_info_3id:
                j['icon'] = '/static/img/group.png'
                j['children'] = [{'type':'user','name':user.user.first_name,'id':user.user.id,'pId':j['id'],'icon':'/static/img/person.png'} for user in UserGroup.objects.filter(group__id = j['id'])]
                groups_info_4id = __get_group(j['id'])
                for g in groups_info_4id:
                    g['icon'] = '/static/img/group.png'
                    g['children'] = [{'type':'user','name':user.user.first_name,'id':user.user.id,'pId':g['id'],'icon':'/static/img/person.png'} for user in UserGroup.objects.filter(group__id = g['id'])]
                    j['children'].append(g)
                i['children'].append(j)
            k['children'].append(i)
    return group_info_1st


如果我想得到直销一组下某个user 的所有上级的组织架构,可以使用递归和内部函数实现:

定义一个函数

def get_group_by_user(user):
    groups = []
    usergroup = UserGroup.objects.get(user = user) 
    groups.append(usergroup.group.name)#得到这个用户的上一级组织架构,这里是直销一组
    
    def is_group(fid):
        if fid == 0:
            return True
        else:
            return False

    def get_groups(fid,groups): 

        if is_group(fid):
            #group = GroupInfo.objects.get(id = fid)
            #groups.append(group.name)
            groups.reverse()
            group_infos = {}
            for k in range(len(groups)):
                group_infos['group_'+str(k+1)] = groups[k]
            return group_infos //{'group_3': u'直销一组', 'group_2': u'政府..', 'group_1': u'一级组织'}
        else:  
            group = GroupInfo.objects.get(id = fid)
            groups.append(group.name)  #groups=[u'直销一组',u'政府..',u'一级组织']
            return get_groups(group.fid,groups)
    return get_groups(usergroup.group.fid,groups) #调用内部函数get_groups(*),参数1,得到直销一组的上一级组织id ,这里为2,groups为直销一组






版权声明:本文为yjf997234900原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。