2010-12-28 15 views
6

मैं मॉडल पेज बनाने की कोशिश कर रहा हूं, पेज "बाल पृष्ठ" भी हो सकता है।Django आत्म-संदर्भित संबंध?

from django.db import models 
from django.contrib import admin 

class Page(models.Model): 
    slug = models.SlugField(blank=True) 
    title = models.CharField(max_length=100) 
    content = models.TextField(blank=True) 
    children = models.ManyToManyField("self", blank=True) 
    published = models.BooleanField(default=True) 
    created = models.DateTimeField(blank=True, auto_now_add=True) 

    def html(self): 
     html = "<li>" 
     html += self.title 

     children = self.children.all() 
     if len(children) > 0: 

      for page in children: 
       html += page.html() 

     html += "</li>" 
     return html 

    def __unicode__(self): 
     return self.title 


class PageAdmin(admin.ModelAdmin): 
    prepopulated_fields = {'slug': ('title',)} 


admin.site.register(Page, PageAdmin) 

क्या मैं गलत कर रहा हूँ:

मेरे मॉडल कोड नीचे मेरी मैक (अजगर 2.6.1) और Ubuntu 10.04 (अजगर 2.6.5) पर crashing Python रखता है? या क्या यह एचटीएमएल-प्रतिपादन विचारों से संबंधित है?

धन्यवाद।

+0

स्टैक ट्रेस में 'PyEval_EvalFrameEx' कॉल की संख्या से एक स्टैक ओवरफ़्लो हो सकता है। पाइथन बग की तरह दिखता है, क्योंकि आमतौर पर पाइथन कुछ बिंदु पर 'रनटाइम त्रुटि: अधिकतम रिकर्सन गहराई' से रिकर्सन तोड़ देगा। – AndiDog

+0

आपके मॉडल पर एक छोटी टिप्पणी: कई से कई संबंध शायद गलत प्रतिनिधित्व है। एक पेड़ में, एक नोड (या आपके कोड में, एक पृष्ठ) में केवल शून्य या एक अभिभावक होता है। एक विदेशी कुंजी 'माता-पिता' बेहतर प्रतिनिधित्व होगा। –

+0

@piquadrat ध्यान देने के लिए धन्यवाद। मैं नींद आती हूँ। – jussi

उत्तर

9

मैं सुझाव है कि आप जो आसान प्रदान करता है रिकर्सिवली संरचना बाहर, उदाहरण के थूकना @http://django-mptt.github.com/django-mptt/templates.html

आप मॉडल first साथ mptt रजिस्टर करने के लिए है, हालांकि की विधि का उपयोग करने django-mptt का उपयोग करें। Including foreign key count in django mptt full tree listing?

+0

पूरी तरह से काम करता है और उपयोग करने में आसान है। धन्यवाद। – jussi

13

मॉडल ही तुम सिर्फ गलत दिशा में इस की सोच रहे हैं के संदर्भ में:

यहाँ मेरी कोड का उपयोग कर रहा है।

children = models.ManyToManyField("self", blank=True) 

उपयोग

parent = models.ForeignKey("self", blank=True, related_name="children") 

के बजाय यह आपको एक पेज रिकॉर्ड से सीधे बच्चों तक पहुँचने लेकिन डेटाबेस में एक और अधिक सरल प्रतिनिधित्व होना चाहिए करने देगा।

एचटीएमएल प्रतिपादन आम तौर पर मॉडल में नहीं, विचारों में होना चाहिए। मध्यस्थ सुझाव के रूप में mptt का प्रयोग करें।

संबंधित मुद्दे