2010-12-28 15 views
6

Sto provando a creare la Pagina modello, la pagina dovrebbe essere in grado di avere anche "pagine figlio".Relazione autoreferenziale Django?

Il mio codice seguente modello mantiene crashing Python sul mio Mac (Python 2.6.1) e Ubuntu 10.04 (Python 2.6.5):

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) 

Che cosa sto facendo di sbagliato? O questo tipo di rendering HTML appartiene alle viste?

Grazie.

+0

Il numero di chiamate 'PyEval_EvalFrameEx' nello stack trace potrebbe aver portato a un overflow dello stack. Sembra molto simile a un bug Python, perché normalmente Python interromperebbe la ricorsione ad un certo punto con 'RuntimeError: maximum recursion depth exceeded'. – AndiDog

+0

Un piccolo commento sul tuo modello: una relazione molti-a-molti è probabilmente la rappresentazione sbagliata. In un albero, un nodo (o nel tuo codice, una pagina) ha solo zero o un genitore. Una chiave straniera 'parent' sarebbe la rappresentazione migliore. –

+0

@piquadrat Grazie per averlo notato. Do la colpa alla sonnolenza. – jussi

risposta

13

In termini di modello stesso si sta solo pensando di questo nella direzione sbagliata. Invece di

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

uso

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

Questo vi permetterà di accedere i bambini direttamente da un record di pagina, ma dovrebbe essere una rappresentazione più semplice nel database.

Il rendering HTML dovrebbe generalmente avvenire nelle viste, non nel modello. Usa mptt come suggerisce il mediatore.

Problemi correlati