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 )