3

我是 FeinCMS 的新手,我正在尝试创建自己的内容类型。这使用了我创建的另一种自定义内容类型。

在下面的代码中,“CollapsiblePanel”没有显示在管理员中,因为我只希望您能够从 ContentBox 部分创建“CollapsiblePanels”。

您还可以为每个 ContentBox 创建多个 CollapsiblePanel。我无法弄清楚如何将它们连接在一起,因此管理员允许您在 ContentBox 中添加 CollapsiblePanel

class CollapsiblePanel(models.Model):
   title = models.CharField(max_length=255)
   content = models.TextField()

   def render(self, **kwargs):
       return render_to_string('collapsiblepanel.django.html', {
           'media': self,
           'title': mark_safe(self.title),
           'text': mark_safe(self.content),
       })

class ContentBoxMedia(RichTextContent):
   title = models.CharField(_('title'), max_length=200, blank=True)
   collapsible = models.BooleanField()
   collapsiblePanels = models.ForeignKey(CollapsiblePanel)

   class Meta:
       abstract = True
       verbose_name = 'Content Box'
       verbose_name_plural = 'Content Box'

   def render(self, **kwargs):
       return render_to_string('contentbox.django.html', {
           'media': self,
           'title': mark_safe(self.title),
           'text': mark_safe(self.text),
       })
4

1 回答 1

2

如果您应该能够拥有多个CollapsiblePanels per ContentBoxMedia,那么您的关系就设置错了——ForeignKey应该是 in CollapsiblePanel

但是,您所追求的似乎是自动处理CollapsiblePanel“内联”?这不会开箱即用,因为 FeinCMS 本身将所有内容类型作为内联ContentBoxMedia处理(因此对象已经作为父对象的内联处理),并且 Django 不支持嵌套内联

我怀疑任何提供此类功能的黑客都会非常复杂。您可以尝试在ContentBoxMedia模板中呈现您自己的表单集,但您需要破解ItemEditor.change_view处理数据的方法,这并不容易。或者,您可以通过采用 Ajax 方法来避免这种情况,但这仅适用于保存 ContentBoxMedia的对象,而不适用于新对象。

或者,您可以尝试ContentBoxMedia直接向管理员注册,以便可以使用内CollapsiblePanel联,但这需要离开主 FeinCMS 父管理页面来单独编辑这些。如果您想探索这一点,则需要使用Base.content_type_for生成的模型并将其注册到您的AdminSite(当然还需要显式注册内联)。

于 2011-03-26T20:35:04.853 回答