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.

Есть ли обходной путь для указания промежуточной модели для полей типа контента?

2 ответа

Решение

Как правило, если вам нужно больше информации при создании поля (например, списка вариантов) или конкретной модели 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

Тем не менее, в вашем случае это не работает, потому что вам также придется создать through модель динамически. Причина в том, что для каждого конкретного DownloadContentвам понадобится еще один бетон DownloadContentFiles модель.

Вы можете достичь этого с помощью type встроенный, чтобы динамически создавать новые DownloadContentFiles конкретные классы (остерегайтесь конфликтов имен при использовании DownloadContent с различными базами CMS, такими как page.Page а также elephantblog.Entry).

Может быть, более простой способ достичь того, что вы хотите:

  • Добавить Downloads модель где-то, и добавить files ManyToManyField в этот класс вместо
  • DownloadContent содержит только ForeignKey(Downloads)

Да, вам нужна другая модель. Это может стоить того, потому что вы можете создать лучший интерфейс для редактирования Downloadsи редактор страниц также упрощен, потому что вам нужно только выбрать один из уже существующих Downloads модели для показа их на странице.

Может быть, явно class_name to create_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")
Другие вопросы по тегам