创建内联管理员,显示最终模型而不是GenericForeignKey链接表

时间:2010-10-03 12:13:00

标签: django django-admin

下面的模型显示了一个简单的GenericForeignKey关系。它已经以这种方式设置,允许任何其他模型重用Image。

class Image(models.Model):
    name = models.CharField(max_length=150)
    desc = models.TextField(max_length=400)
    resource = models.ImageField(upload_to='imgs/generic/%Y/%m/%d')

    def __unicode__(self):
        return self.name

class ImageItem(models.Model):
    image = models.ForeignKey(Image, related_name='items', db_index=True)
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField(db_index=True)
    object = generic.GenericForeignKey('content_type','object_id')

    class Meta:
        unique_together = (('image', 'content_type', 'object_id'),)

        def __unicode__(self):
            return u'%s [%s]' % (self.object,  self.image)

class ImageInline(generic.GenericTabularInline):
    model = ImageItem

目前在另一个模型的管理员中使用ImageInline将显示一个列表框,其中包含系统中的所有图像。

是否可以让内联管理员显示实际的图像模型,仅显示分配给正在编辑的模型的图像?因此,允许用户立即看到附加到正被添加/编辑的模型的图像上的所有相关信息。以及能够添加/删除相关图像。

提前感谢您对此的帮助。

1 个答案:

答案 0 :(得分:2)

您必须将代码更改为:

class Image(models.Model):
    name = models.CharField(max_length=150)
    desc = models.TextField(max_length=400)
    resource = models.ImageField(upload_to='imgs/generic/%Y/%m/%d')
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField(db_index=True)
    object = generic.GenericForeignKey('content_type','object_id')

    class Meta:
        unique_together = (('resource', 'content_type', 'object_id'),)

    def __unicode__(self):
        return u'%s [%s]' % (self.object,  self.resource)


class ImageInline(generic.GenericTabularInline):
    model = Image


class MyModelAdmin(admin.ModelAdmin):
    inlines = [
        ImageInline,
    ]

这样,当您在管理员中添加/更改MyModel时,您可以将图像添加为内联。

更新:

文件浏览器字段解决方案:

class Image(models.Model):
    name = models.CharField(max_length=150)
    desc = models.TextField(max_length=400)
    resource = FileBrowseField("Image", max_length=200, directory="imgs/generic/%Y/%m/%d", extensions=['.jpg', '.gif', '.png'], format='Image')
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField(db_index=True)
    object = generic.GenericForeignKey('content_type','object_id')

    class Meta:
        unique_together = (('resource', 'content_type', 'object_id'),)

    def __unicode__(self):
        return u'%s [%s]' % (self.object,  self.resource)


class ImageInline(generic.GenericTabularInline):
    model = Image


class MyModelAdmin(admin.ModelAdmin):
    inlines = [
        ImageInline,
    ]

有关filebrowser字段的更多信息,请访问:http://code.google.com/p/django-filebrowser/wiki/installationfilebrowsefield