比方說,我有一個Post對象,可以包含圖像,視頻和其他媒體類型。我可以使用GenericForeignKey
將它們鏈接在一起。喜歡的東西:GenericForeignKey和Django中的管理員
class Post(models.Model):
title = models.CharField(...)
text = models.TextField(...)
class AudioMedia(models.Model):
...
class VideoMedia(models.Model):
...
class ImageMedia(models.Model):
...
class MediaObject(models.Model):
post = models.ForeignKey(Post)
order = models.IntegerField()
content_type_media = models.ForeignKey(
ContentType, limit_choices_to={
'model__in': (
'audiomedia',
'imagemedia',
'videomedia')
})
object_id_media = models.PositiveIntegerField()
obj = generic.GenericForeignKey('content_type_media', 'object_id_media')
現在,我可以很容易地創建一個管理界面,如:
class MediaObjectAdminInLine(admin.StackedInline):
model = MediaObject
ct_field = "content_type_media"
ct_fk_field = "object_id_media"
extra = 0
class PostAdmin(admin.ModelAdmin):
inlines = [MediaObjectAdminInLine]
現在問題:)在管理員/,我可以很容易地創建一個新的帖子。對於這篇文章,我可以輕鬆添加更多的MediaObject。在面板中,我有一個下拉菜單來選擇類型(音頻,視頻,...),但我必須手動輸入我想與Post鏈接的對象的ID。
我嘗試過各種擴展,包括grappelli。有些提供了查找這些鏈接的對象的能力。我希望能夠在這裏添加對象,例如添加一個AudioMedia,一個VideoMedia,一個ImageMedia,這取決於我從下拉列表中選擇什麼。
有什麼建議嗎?
我還沒有嘗試過,但一個想法 - 你能不能有一個管理表單,並且該表單覆蓋'object_id'的默認文本框是一個'ModelChoiceField'? – karthikr