Django管理员内联模型定制

时间:2012-04-05 18:57:48

标签: python django django-admin

有没有办法将django admin inline-models与模型聚类一起解耦?

一些上下文:我有一个名为Page的模型,它有两个内联模型,TextBlock和GalleryContainer。我会根据页面管理编辑器中添加的顺序在模板上呈现TextBlocks和GalleryContainers。默认的django-admin显示如下所示:

django-admin display

我希望它显示为:

  • Gallery Container 1
  • Textblock 1
  • Gallery Container 2

但我不知道该怎么做。任何正确方向的建议或推动都将是一个很大的帮助。提前致谢。 (我也希望我的问题有道理......)

1 个答案:

答案 0 :(得分:0)

如果您想要列和图库之间的关系,您的模型应该反映出来。所以,如果我理解正确:页面有名称和列。列包含文本,图库(可选)和排序。

models.py:

class Page(models.Model):
   name = models.CharField(max_length=200)

class Gallery(models.Model):
   name = models.CharField(max_length=200)

class Column(models.Model):
   page = models.ForeignKey(Page)
   text = models.TextField()
   gallery = models.ForeignKey(Gallery, null=True, blank=True) # Optional
   ordering = models.IntegerField()

   class Meta:
       ordering = ('ordering', )

此示例显示了IntegerField的排序方式。如果您想根据添加的位置对列进行排序

ordering = models.IntegerField()

models.datetimeField(auto_now_add=True)

在您的admin.py中:

class ColumnInline(admin.TabularInline): # or StackedInline
    model = Column

class PageAdmin(admin.ModelAdmin):
    inlines = [
        ColumnInline,
    ]

注意:我将“图库显示名称”设置为“名称”。更有意义的是只给画廊一次它的名字。但是如果一个图库位于更多具有不同名称的地方,那么您需要在列模型上使用一个字段(例如'gallery_display_name = models.CharField(max_lenght = 200)')。

这是你问题的答案吗?我希望它有所帮助!