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 )