Django
mptt½éÉÜÒÔ¼°Ê¹ÓÃ
Django mpttÊǸöDjangoµÚÈý·½×é¼þ£¬Ä¿±êÊÇʹDjangoÏîÄ¿ÄÜÔÚÊý¾Ý¿âÖд洢²ã¼¶Êý¾Ý£¨Ê÷ÐÎÊý¾Ý£©¡£ËüÖ÷ҪʵÏÖÁËÐ޸ĹýµÄǰÐò±éÀúËã·¨£¬Èç¹ûÄã¶ÔÔÀí»¹²»ÊǺÜÁ˽⣬¿ÉÒÔ¿´ÎÒµÄÕâÆªÎÄÕ¡£µ±È»£¬Ê¹ÓÃmpttʱ£¬ÔÀíÊÇ¿ÉÒÔ²»ÓÃÁ˽âµÄ£¬ÒòΪ¾ßÌåµÄʵÏÖϸ½Ú¶¼ÒѾÒþ²Ø¡£²»¹ý£¬Èç¹ûÏîÄ¿²»ÊÇʹÓõÄDjango£¬¿ÉÒԲο¼¾ßÌåµÄʵÏÖÔÀí¡£
ÔÚÕûƪÎÄÕÂÖУ¬ÎÒÃǽ«»áÄá¶ÔÚÊý¾Ý¿âÖд洢²ã¼¶½á¹¹¡·ÖеÄÀý×Ó×÷Ϊ±¾ÎĵÄÀý×Ó¡£ÎÒÃÇ´òËãÔÚÊý¾Ý¿âÖд洢ÕâÕÅͼÖеÄÊý¾Ý£º

ÔÚ½éÉÜmptt֮ǰ£¬Èç¹ûÄãµÄÐèÇó½ö½öÊÇÏñÕâÑùÏÔʾÒÔÉÏÊý¾Ý£º
<li>Food
<ul> <li>Fruit <ul>
<li>Red <ul> <li>Cherry</li>
</ul> </li> <li>Yellow
<ul> <li>Banana</li>
</ul> </li> </ul>
</li> <li>Meat <ul>
<li>Beef</li> <li>Pork</li>
</ul> </li> </ul>
</li> |
mptt¾ÍÏԵôó²ÄСÓÃÁË£¬ÒòΪDjangoÒѾÓÐÄÚÖÃÄ£°å¹ýÂËÆ÷À´Íê³ÉÕâ¸ö¹¤×÷£ºunordered_list£¨¹Ù·½Îĵµ£©¡£Èç¹ûÄãµÄÐèÇó²»Ö»Õâô¼òµ¥£¬ÄǾÍÌø¹ýÕâÒ»¶Î¡£²»¹ýÕâÀﻹÊÇÒª½²½âÒ»ÏÂunordered_listµÄ×ö·¨¡£ÎÒÃǾÍÀ´ÊµÏÖÒÔÉϵĽá¹û¡£
µ±È»ÎÒÃÇÊ×ÏÈҪдһ¸ö¼òµ¥µÄModel¡£
from django.db
import models
class Food(models.Model):
title= models.CharField(max_length=50)
parent= models.ForeignKey("self", blank=True,
null=True, related_name="children")
def__unicode__(self):
returnself.title |
¿ªÆô×Ô¶¯admin£¬ÔÚºǫ́Ìí¼ÓÍêÊý¾Ý¡£½Ó×Å£¬ÎÒÃÇÀ´¿´¿´ÔõôÑùʹÓÃunordered_listÕâ¸ö¹ýÂËÆ÷À´ÏÔʾÊ÷ÐÎͼ¡£
°´ÕÕ¹Ù·½ÎĵµµÄ˵·¨£¬ÏÔʾʱ´«µÝ¸øtemplateµÄÊý¾ÝÓ¦¸ÃÊÇÕâÑù£º
['Food', ['Fruit',
['Red', ['Cherry'],'Yellow', ['Banana']],'Meat',
['Beef','Pork']]] |
ÎÒÃÇÐèҪдһ¸öµÝ¹éµÄ¹¤¾ßº¯Êý£º
def display(foods):
display_list= []
forfood in foods:
display_list.append(food.title)
children= food.children.all()
iflen(children) > 0:
display_list.append(display(food.children.all()))
returndisplay_list |
ÓÚÊÇÔÚviewsÖУ¬ÎÒÃÇÖ»ÒªµÃµ½¸ù½Úµã£¬È»ºó°Ñdisaplyº¯ÊýÉú³ÉµÄÁÐ±í´«µÝ¸øtemplate£¬¾ÍÏñÕâÑù£º
from django.shortcuts
import render_to_response
def unordered_list(request):
foods= Food.objects.filter(parent=None)
var= display(foods)
returnrender_to_response('mpttexample/unordered_list.html',
{'var': var}) |
×îºóÔÚÄ£°åÖÐÌí¼Ó£º
¾Í¿ÉÒÔ¿´µ½ÏÔʾЧ¹ûÁË¡£
¹ØÓÚunordered_list¹ýÂËÆ÷µÄÓ÷¨¾Í½éÉܵ½ÕâÀï¡£ÒòΪÓÐʱºòÐèÇó²»Ö¹Õâô¼òµ¥£¬±ÈÈçÓÐʱÐèÒªÕ¹ÏÖÑùʽµÈµÈ£¬unordered_list¾ÍÔ¶Ô¶²»¹»ÁË¡£Õâ¸öʱºò¾ÍÐèÒªmptt£¬ÏÂÃæ¿ªÊ¼½éÉÜmpttµÄÓ÷¨¡£
Ê×ÏÈÊǰ²×°mptt£¬Èç¹û°²×°ÁËsetup tools£¬¾Í¿ÉÒÔÓÃÕâ¸öÖ¸Á
easy_install django-mptt
ÏÂÔØ°ü°²×°µÄ·½Ê½¾Í²»×¸ÊöÁË£¬ÏÂÔØµØÖ·ÔÚÕâÀï¡£
°²×°Íê³Éºó£¬ÐèÒªÔÚsettingsÎļþϵÄINSTALLED_APPSÖÐÌí¼Ó'mptt'¡£
½Ó×ÅдModels£¬ÕâÀïÎÒÃǵÄModelsÏà֮ǰµÄʵÏÖ¼¸ºõûÓÐÈκεı仯¡£Ö»Ðè¼Ì³ÐMPTTModelÀࣺ
<div class="line
number1 index0 alt2"><code class="python
keyword">from</code> <code class="python
plain">mptt.models </code><code
class="python keyword">import</code>
<code class="python plain">MPTTModel</code></div>
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ÔªÀàÖÐÖ¸Ã÷£º
from mptt.models
import MPTTModel
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
|
ModelµÄÆäËûÑ¡ÏÇë²Î¿¼¹Ù·½ËµÃ÷¡£
¶ÔÓڼ̳ÐMPTTModelµÄÀàµÄʵÀý£¬½«»áÓжîÍâµÄ·½·¨£¬±ÈÈçget_ancestors£¨¸ü¶à²Î¿¼Îĵµ£©¡£ÎÒÃÇÔËÐÐmanage.py
shellÃüÁî×÷ʵÑ飺
Python manage.py shell

Èç¹û°²×°ÁË×Ô¶¯Admin£¬¿ÉÒÔÔÚAdminÄ£°åÖÐÏñÕâÑùÏÔʾÊý¾Ý£º

Ö»ÐèÔÚadmin.site×¢²á£¬ÏñÕâÑù£º
from django.contrib
import admin
from mptt.admin import MPTTModelAdmin
admin.site.register(MPTTFood, MPTTModelAdmin)
|
½ÓÏÂÀ´µÄ»°Ì⣬¾ÍÊÇÔõÑùÔÚÄ£°åÖÐÏÔʾµÄÎÊÌâ¡£ÎÒÃÇÀ´ÐÞ¸Ä֮ǰordered_listµÄÏÔʾ£¬½á¹¹ÊÇÒ»ÑùµÄ£¬Ö»ÊǶÔÓÚÒ¶×ӽڵ㣬ÎÒÃÇÈÃËüÏÔʾ³ÉºìÉ«¡£ÔÚÄ£°åÖУ¬²»ÒªÍüÁ˼ӡ±{%
load mptt_tags %}¡°¡£
{% load mptt_tags
%}
{% recursetree nodes %}
<li>
{% if node.is_leaf_node %} <spanstyle="color:
red;">{{ node.title }}</span>
{% else %}
{{ node.title }} <ul>
{{ children }} </ul>
{% endif %}
</li>
{% endrecursetree %} |
ÕâÀïÔÚÊÓͼÖд«µÝ¸øÄ£°åµÄ²ÎÊýÃû±ØÐëÊÇnodes¡£viewsÖоÍÏñÕâÑù£º
def mptt(request):
nodes= MPTTFood.tree.all()
returnrender_to_response('mpttexample/mptt.html',
{'nodes': nodes}) |
Ä£°åÖÐµÄÆäËûÓ÷¨£¬Çë²Î¿¼¹Ù·½Îĵµ¡£
¹ØÓÚmpttµÄ½éÉܾ͵½ÕâÀÈç¹ûÒÔÉÏÕâЩ²»ÄÜÂú×ãÄãµÄÐèÇó£¬ÈçÔÚdjango formsÖÐʹÓÃmptt
form fieldµÈµÈ£¬Çë¼ÌÐø²Î¿¼MPTT¹Ù·½Îĵµ¡£
¹ý¶Îʱ¼ä£¬Ôٺʹó¼Ò·ÖÏíMPTTµÄÔ´Âë¡£
|