比方说,我有一个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