2010-12-28 38 views
6

Tôi đang cố tạo Trang mô hình, trang cũng sẽ có thể có "trang con".Mối quan hệ tự giới thiệu Django?

mã mô hình của tôi dưới đây giữ crashing Python trên máy Mac của tôi (python 2.6.1) và 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) 

Tôi đang làm gì sai? Hay việc hiển thị HTML kiểu này thuộc về chế độ xem?

Cảm ơn.

+0

Số lượng cuộc gọi 'PyEval_EvalFrameEx' trong theo dõi ngăn xếp có thể dẫn đến tràn ngăn xếp. Trông giống như một lỗi Python, vì thông thường Python sẽ phá vỡ đệ quy tại một số điểm với 'RuntimeError: độ sâu đệ quy tối đa đã vượt quá'. – AndiDog

+0

Một nhận xét nhỏ về mô hình của bạn: quan hệ nhiều-nhiều có lẽ là biểu diễn sai. Trong một cây, một nút (hoặc trong mã của bạn, một trang) chỉ có số không hoặc một phụ huynh. Chìa khóa nước ngoài 'cha mẹ' sẽ là đại diện tốt hơn. –

+0

@piquadrat Cảm ơn bạn đã chú ý. Tôi đổ lỗi cho buồn ngủ. – jussi

Trả lời

13

Xét về mô hình chính nó bạn chỉ cần nghĩ đến việc này theo hướng sai. Thay vì

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

sử dụng

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

này sẽ cho phép bạn truy cập vào trẻ em trực tiếp từ mức kỷ lục trang nhưng phải là một đại diện đơn giản hơn trong cơ sở dữ liệu.

Hiển thị HTML thường xảy ra trong chế độ xem, không phải trong mô hình. Sử dụng mptt làm trung gian.

Các vấn đề liên quan