Django管理后台根据类类型更改嵌套表单

2 投票
1 回答
1243 浏览
提问于 2025-04-16 14:08

我之前在一个问题中问过关于Django继承的事情。现在我想弄明白如何让管理界面与之配合使用。

假设我有一些模型,像这样:

class ContentItem(models.Model):
    title = models.CharField(max_length=1000)
    page_order = models.IntegerField()
    last_update_date = models.DateTimeField(default=datetime.now())

    class Meta:
      abstract = True
      ordering = ['page_order', 'last_update_date', 'title']

class LinkContent(ContentItem):
  url = models.URLField()
  link_text = models.CharField(max_lenth=1000)

class TextContent(ContentItem):
 text = models.CharField()


class VideoContent(ContentItem):
      title = models.CharField()
      video_file = models.FieldField(upload_to = 'videos')

class Page(models.Model):
  contents = models.ManyToManyField(ContentItem)
  title = models.CharField()

假设我使用的是django-model-utils,就像之前问题的回答中提到的那样。

我该如何让管理界面根据子类显示正确的内联内容呢?我希望能看到每种类型的正确内联内容。比如说,如果我在内容里有3个项目:一些文本、一个链接和一个视频。那么当我在管理界面查看那个页面时,我希望能看到每个项目的内联表单。

这个怎么实现呢?

另外,我该如何处理向关系中添加新内容呢?理想情况下,当用户想添加一个新的内容项时,他们应该被问到需要添加什么类型的内容项。然后那个内容类型的添加表单会在弹窗中打开。所以如果我指定想添加视频内容,我就会看到一个弹窗让我上传视频。如果我指定想要文本内容,我就会看到一个弹窗让我输入文本。

看起来在处理页面模型的更改表单时需要特别注意。有什么建议来解决这个问题吗?

1 个回答

0

原来,如果你使用django-model-utils这个工具,并且进行继承的话,就可以为每个子类添加内联表单。Django的管理后台会自动识别这些内容,并显示出对应的表单。

问题解决了。

撰写回答