Джанго самореферентные отношения? - PullRequest
6 голосов
/ 28 декабря 2010

Я пытаюсь создать страницу модели, страница также должна иметь «дочерние страницы».

Код моей модели ниже сохраняет сбой Python на моем Mac (python 2.6.1) и 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)

Что я делаю не так?Или этот вид HTML-рендеринга относится к представлениям?

Спасибо.

Ответы [ 2 ]

13 голосов
/ 28 декабря 2010

Что касается самой модели, вы просто думаете об этом в неправильном направлении. Вместо

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

использование

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

Это позволит вам получить доступ к дочерним элементам непосредственно из записи страницы, но должно быть более простым представлением в базе данных.

Рендеринг HTML обычно должен происходить в представлениях, а не в модели. Используйте mptt, как подсказывает медер.

9 голосов
/ 28 декабря 2010

Я предлагаю вам использовать django-mptt, который предлагает более простой в использовании метод рекурсивного выделения структуры, например @ http://django -mptt.github.com / django-mptt / templates.html

Вы должны зарегистрировать mptt для модели first .

Вот мой код, использующий его: Включая подсчет внешнего ключа в списке полного дерева django mptt?

...