FeinCMS,内容类型字段的中间模型

时间:2013-04-03 12:18:58

标签: django feincms

我正在努力完成以下任务:

class DownloadContentFiles(models.Model):
    download_content = models.ForeignKey('DownloadContent')
    media_file = models.ForeignKey(MediaFile)

class DownloadContent(models.Model):
    files = models.ManyToManyField(MediaFile, through=DownloadContentFiles)

    class Meta:
        abstract=True

我可以看出为什么这不起作用。因为DownloadContent上的摘要。

是否有解决方法为contenttype字段指定中间模型?

2 个答案:

答案 0 :(得分:1)

通常,如果在创建字段(例如选择列表)或具体的Django模型时(如果需要)需要更多信息,则可以使用initialize_type

class DownloadContent(models.Model):
    @classmethod
    def initialize_type(cls):
        cls.add_to_class('files', ... your model field ...)

MediaFileContent使用此方法添加type选择器:

https://github.com/feincms/feincms/blob/master/feincms/content/medialibrary/models.py#L58

然而,在您的情况下,这不起作用,因为您还必须动态创建through模型。这样做的原因是,对于每个具体的DownloadContent,您需要另一个具体的DownloadContentFiles模型。

您可以通过使用type内置动态创建新的DownloadContentFiles具体类来实现此目的(当使用具有不同CMS基础的DownloadContent时要小心名称冲突,例如{{1 }和page.Page)。

也许是一种更简单的方法来实现您的目标:

  • 在某处添加elephantblog.Entry模型,然后将Downloads files添加到此类
  • ManyToManyField仅包含DownloadContent

是的,你需要另一种型号。这可能是值得的,因为您可以为ForeignKey(Downloads)构建更好的编辑界面,并且页面编辑器也被简化,因为您只需选择一个已存在的Downloads模型在页面上显示它们

答案 1 :(得分:0)

明确定义class_namecreate_content_type可能对您有用。像这样:

class DownloadContentFiles(models.Model):
    download_content = models.ForeignKey('MyDownloadContent')
    media_file = models.ForeignKey(MediaFile)

class DownloadContent(models.Model):
   files = models.ManyToManyField(MediaFile, through=DownloadContentFiles)

    class Meta:
        abstract=True

Page.create_content_type(DownloadContent, class_name="MyDownloadContent")