download:Go+Python双语言混合开发 盯紧技术先机 放松高薪时机

from django. db. models. signals import pre_save

class ArticleCategory (models. Model ):

name  = models. CharField (max_length = 50 ) 
parent  = models. ForeignKey ( 'self' , null = True , blank = True , related_name = 'children' )     
path  = models. CharField (max_length = 255 ,  null = True , blank = True ) 


 def  __unicode__ ( self ): 
     if  self. id  ==  self. path: 
         return  self. name 
     else: 
         return  self. node 

 
 def _node ( self ): 
    indent_num  =  len ( self. path. split ( ':' ) ) - 1 
    indent  =  '....' * indent_num 
    node  = u '%s%s' %  (indent ,  self. name ) 
     return node 
node  =  property (_node ) 


 class Meta: 
    ordering  =  [ 'path' ] 


 #设置在model中的用处是,是在所有节点保留时递归的循环上来,更新所有的节点的门路 
 def save ( self , * args , ** kwargs ): 
     super (ArticleCategory , self ). save (*args , ** kwargs ) 

     if  self. parent: 
         self. path  =  '%s:%s' %  ( self. parent. path ,  self. id ) 
     else: 
         self. path  =  self. id 

    childrens  =  self. children. all ( ) 
     if  len (childrens )  >  0: 
         for children  in childrens: 
            children. path  =  '%s:%s' %  ( self. path , children. id ) 
            children. save ( ) 
     super (ArticleCategory , self ). save (*args , ** kwargs ) 
信号触发,更新

def inital_articlecategory_path (sender , instance , **kwargs ):

 if instance. id: 
     if instance. parent: 
        instance. path  =  '%s:%s' %  (instance. parent. path , instance. id ) 
     else: 
        instance. path  = instance. id 

pre_save. connect (inital_articlecategory_path , sender =ArticleCategory )

class ArticleCategoryAdmin (admin. ModelAdmin ):

list_display  =  [ 'treenode' , 'patha' , 'id' ,  ] 
ordering  =  [ 'path' ] 

 def patha ( self , obj ): 
     if obj. parent: 
         return u '%s > %s' %  (obj. parent , obj. name ) 
     return obj. name 

patha. short_description  =  'path' 
patha. allow_tags  =  True 
 

 def treenode ( self , obj ): 
    indent_num  =  len (obj. path. split ( ':' ) ) - 1 
    p  =  '<div style="text-indent:%spx;">%s</div>' %  (indent_num* 25 , obj. name ) 
     return p 

treenode. short_description  =  'tree path' 
treenode. allow_tags  =  True 

admin. site. register (ArticleCategory , ArticleCategoryAdmin )