假设我有一个 Post 对象,它可以包含图像、视频和其他媒体类型。我可以使用 aGenericForeignKey
将它们链接在一起。就像是:
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]
现在的问题:) 在 admin/ 中,我可以轻松地创建一个新帖子。在帖子中,我可以轻松添加更多 MediaObject。在面板中,我有一个下拉菜单来选择类型(音频、视频……),但我必须手动输入要与 Post 链接的对象的 ID。
我尝试了各种扩展,包括 grappelli。有些提供了在此处查找要链接的对象 ID 的功能。我希望能够在此处添加对象,例如添加 AudioMedia、VideoMedia、ImageMedia,具体取决于我从下拉列表中选择的内容。
有什么建议么?