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")