Создание встроенного администратора, который отображает окончательную модель вместо таблицы ссылок GenericForeignKey - PullRequest
3 голосов
/ 03 октября 2010

Приведенные ниже модели показывают простое отношение GenericForeignKey.Он был настроен таким образом, чтобы разрешить повторное использование изображения любой другой моделью.

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 Ответ

2 голосов
/ 05 октября 2010

Вы должны изменить свой код на:

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,
    ]

Более подробную информацию о поле обозревателя файлов можно найти здесь: http://code.google.com/p/django-filebrowser/wiki/installationfilebrowsefield

...