Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
Django Ê÷ÐνṹʵÏÖ·½·¨
 
À´Ô´£ºcsdn ·¢²¼ÓÚ:2017-7-13
  3938  次浏览      28
 

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})

×îºóÔÚÄ£°åÖÐÌí¼Ó£º

{{ var|unordered_list }}

¾Í¿ÉÒÔ¿´µ½ÏÔʾЧ¹ûÁË¡£

¹ØÓÚ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µÄÔ´Âë¡£

 

   
3938 ´Îä¯ÀÀ       28
Ïà¹ØÎÄÕÂ

ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖÓë̽ÌÖ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
Ïà¹ØÎĵµ

Android_UI¹Ù·½Éè¼Æ½Ì³Ì
ÊÖ»ú¿ª·¢Æ½Ì¨½éÉÜ
androidÅÄÕÕ¼°ÉÏ´«¹¦ÄÜ
Android½²ÒåÖÇÄÜÊÖ»ú¿ª·¢
Ïà¹Ø¿Î³Ì

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
Androidϵͳ¿ª·¢
AndroidÓ¦Óÿª·¢
ÊÖ»úÈí¼þ²âÊÔ