2011-11-30 262 views
1

假設我有models.py以下型號:Django的自我指涉模型在管理網站許多一對多直列樹

class Category(models.Model): 
    name = models.CharField(max_length=128) 
    parent = models.ForeignKey('self', null=True, blank=True) 

class Item(models.Model): 
    name = models.CharField(max_length=128) 
    categories = models.ManyToManyField(Category, related_name='categories') 

class Membership(models.Model): 
    category = models.ForeignKey(Category) 
    item = models.ForeignKey(Item) 
    date_assigned = models.DateField() 

而且,在Working with many-to-many intermediary models記錄,我有這樣的admin.py

class MembershipInline(admin.TabularInline): 
    model = Membership 
    extra = 3 

class CategoryAdmin(admin.ModelAdmin): 
    inlines = (MembershipInline,) 

class ItemAdmin(admin.ModelAdmin): 
    inlines = (MembershipInline,) 

當創建在管理站點的Item,類別直列形式的確呈現,但僅僅作爲<select>窗口小部件,它在某種程度上有些累贅,因爲每個類別被在同一水平所示。

我怎麼能得到這些渲染爲樹?我不需要非常花哨的東西,選擇內的一些縮進就可以。

我嘗試使用django-mpttdjango-treebeard,但他們似乎沒有涵蓋的內聯中介多對多模型案例。

回答

2

如果您使用mptt註冊項目模型。您可以覆蓋unicode的方法:

class Item(models.Model): 

    ... 

    def __unicode__(self): 
     return '%s%s' % (' ' * self.level, super(MarkerCategory, self).__unicode__()) 

如果你想有一個清晰的解決方案,你應該覆蓋的形式,並更改窗口小部件並在這一特定的小工具來做到這一點的邏輯。

+0

這是一個充滿希望的想法,但瀏覽器似乎並沒有呈現'