Django Tree表

Aug 15, 2015


Django 大致有两种方法处理tree表,下面就简略介绍下这两种方法


迭代法

  • 定义模型
    
     class Food(models.Model):
         title= models.CharField(max_length=50)
         parent= models.ForeignKey("self", blank=True, null=True, related_name="children")
         def __unicode__(self):
             return self.title
     
  • 定义递归,生成待处理的列表
    
    def display(foods):
     display_list= []
     for food in foods:
         display_list.append(food.title)
         children= food.children.all()
         if len(children) > 0:
             display_list.append(display(food.children.all()))
     return display_list
         
  • 注册model 在admin中增加一些数据

  • 处理函数
    
    def shanyjhello(request):
     foods= Food.objects.filter(parent=None)
     var= display(foods)
     return render_to_response('syj.html', {'var': var})
         
  • 模板显示: { { var | unordered_list } }

MPTT法

  • 安装和配置:

    • pip install django-mptt

    • 加入mptt至install app中

  • 定义模型

    • 普通模式
      
       class MPTTFood(MPTTModel):
         title= models.CharField(max_length=50)
         parent= models.ForeignKey("self", blank=True, null=True, related_name="children")
         def__unicode__(self):
             returnself.title
       
    • 实际上MPTTModel隐藏了四个变量:level,lft,rght和tree_id。大多数时候我们是用不到这几个变量的

    • 如果你的Model中parent变量名字不是”parent”时,应当在Model类中MPTT元类中指明
      
       class MPTTFood(MPTTModel):
         title= models.CharField(max_length=50)
         parent_food= models.ForeignKey("self", blank=True, null=True, related_name="children"
         classMPTTMeta:
             parent_attr= 'parent_food'
         def__unicode__(self):
             returnself.title
       
  • 管理
    
     from django.contrib import admin
     from mptt.admin import MPTTModelAdmin
     admin.site.register(MPTTFood, MPTTModelAdmin)
     
  • view方法
    
     def mptt(request):
         nodes= MPTTFood.objects.all()
         returnrender_to_response('mpttexample/mptt.html', {'nodes': nodes})
     
  • 模板
    
     { % load mptt_tags % }
     { % recursetree nodes % }
      < li >
             { { node.title } }
             < ul >
                 { { children } }
             < /ul >
         { % endif % }
     < /li >
     { % endrecursetree % }