2010-10-03 7 views
3

Les modèles ci-dessous montrent une relation GenericForeignKey simple. Il a été configuré de cette manière pour permettre à une image d'être réutilisée par n'importe quel autre modèle.Création d'un admin inline qui affiche le modèle final au lieu de la table de liens 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 

À l'heure actuelle à l'aide ImageInline au sein de l'administration d'un autre modèle affiche une zone de liste avec toutes les images du système.

Est-il possible d'obtenir que l'administrateur inline affiche le modèle d'image réel, affichant uniquement les images affectées au modèle en cours d'édition? Permettant ainsi à l'utilisateur de voir immédiatement toutes les informations liées sur les images attachées au modèle en cours d'ajout/édition. En plus d'être en mesure d'ajouter/supprimer des images connexes.

Merci d'avance pour votre aide sur celui-ci.

Répondre

2

Vous devez changer votre code:

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

De cette façon, quand vous allez à ajouter/changer MyModel dans l'admin vous pouvez ajouter des images comme inline.

MISE À JOUR:

Solution avec le champ du navigateur de fichier:

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

Plus d'informations sur le champ du navigateur de fichier se trouve ici: http://code.google.com/p/django-filebrowser/wiki/installationfilebrowsefield

+0

Ceci est une bonne idée, et certainement résoudre le problème que je J'ai. Cependant, je voulais que les images soient réutilisables pour réduire la redondance des données et donc permettre par exemple deux articles d'utiliser la même image. Pensez-vous que cela pourrait être fait en utilisant un gestionnaire du côté du modèle Image? – Nick

+0

Vous pouvez également utiliser FileBrowseField à partir de http://code.google.com/p/django-filebrowser/. De cette façon, les fichiers ne seraient téléchargés qu'une seule fois dans FileBrowser. –