3

FeinCMS は初めてで、独自のコンテンツ タイプを作成しようとしています。これは、私が作成した別のカスタム コンテンツ タイプを使用します。

以下のコードでは、ContentBox セクションから「CollapsiblePanels」を作成できるようにしたいだけなので、「CollapsiblePanel」は管理画面に表示されません。

また、ContentBox ごとに複数の CollapsiblePanels を作成することもできます。管理者が ContentBox 内に CollapsiblePanels を追加できるように、これを一緒に配線する方法を理解するのに苦労しています

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

CollapsiblePanelごとに複数の を使用できるようにする必要がある場合ContentBoxMedia、関係が間違った方法で設定されています。代わりForeignKeyに を使用する必要があり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 に答える