首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django自我引用模型作为管理站点中的多对多内联树

Django自我引用模型作为管理站点中的多对多内联树
EN

Stack Overflow用户
提问于 2011-11-30 19:45:05
回答 2查看 1.5K关注 0票数 1

假设我在models.py中有以下模型

代码语言:javascript
复制
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中有以下内容

代码语言:javascript
复制
class MembershipInline(admin.TabularInline):
    model = Membership
    extra = 3

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

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

当在管理站点中创建Item时,类别内联表单确实被呈现,但仅仅作为<select>小部件呈现,这有点麻烦,因为每个类别都显示在相同的级别。

我怎样才能把它们渲染成树呢?我不需要非常花哨的东西,在select中进行一些缩进就可以了。

我尝试使用django-mpttdjango-treebeard,但它们似乎没有内联的中间多对多模型案例。

EN

回答 2

Stack Overflow用户

发布于 2011-11-30 20:20:25

如果您将物料模型注册到mptt。您可以覆盖unicode方法:

代码语言:javascript
复制
class Item(models.Model):

    ...  

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

如果您想要一个更干净的解决方案,您应该覆盖表单,并更改小部件,并在此特定小部件中执行此逻辑。

票数 2
EN

Stack Overflow用户

发布于 2011-12-05 02:14:00

我讨厌浏览器是“聪明的”。

代码语言:javascript
复制
from django.utils.safestring import mark_safe

...

class Item(models.Model):

    ...  

    def __unicode__(self):
         return mark_safe('%s%s' % ('&nbsp;' * 4 * self.level,
                          super(Item, self).__unicode__()))

但我建议将此逻辑放在指定的小部件中

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8325414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档