Question

J'essaie de créer une image combinée de toutes les images ajoutées à un modèle dans Django avec l'édition en ligne et une clé étrangère. J'ai ces modèles (simplifiés):

class Modell(models.Model):
    title = models.CharField('beskrivelse', max_length=200)
    slug = models.SlugField()
    is_public = models.BooleanField('publisert', default=True)

    def __unicode__(self):
        return self.title

    def save(self, **kwargs):
        super(Modell, self).save(**kwargs)

        on_modell_saved(self)   

class Image(models.Model):
    modell = models.ForeignKey(Modell, related_name="images")
    image = ThumbnailImageField('bilde', upload_to=get_upload_path_image)

    class Meta:
        verbose_name = 'bilde'
        verbose_name_plural = 'bilder'

    def __unicode__(self):
        return str(self.image)

Ensuite, j'ajoute une image au modèle avec AdminInline. Ainsi, lorsque je sauvegarde le modèle, je sauvegarde x nombre d'images.

Mais lorsque j'essaie de faire quelque chose avec Modell.images.all dans la fonction on_modell_saved, je ne peux pas obtenir les objets. J'ai cette fonction qui est exécutée à Modell.save ()

def on_modell_saved(instance):
    for img in instance.images.all():
        print img

Cela n’imprime quelque chose que la deuxième fois que j’enregistre le modèle, et non la première fois. Quelqu'un sait donc comment appeler une fonction après avoir enregistré tous les éléments que vous ajoutez avec AdminInline?

Était-ce utile?

La solution

Modèle et Image sont deux modèles distincts connectés avec une ForeignKey . Même s'ils semblent tous deux être sauvés ensemble , ils ne le font pas. Ils sont sauvegardés un par un (d’abord le Modell ou d’abord les Image ).

Logiquement, les images sont enregistrées après Modell . Parce qu'ils ont une ForeignKey pointant sur Modell et si vous essayez de les sauvegarder en premier, car il n'y a pas de Modell , ils ne pointeront vers rien ( ce qui est possible avec null = True ).

Donc, au moment où Modell.save () est appelé Image , il n'existe pas.

La solution dépend de ce que vous souhaitez faire. ? Je suppose que l’objectif ici n’est pas simplement d’imprimer les images s.

Autres conseils

L'instance de Modell n'est pas enregistrée lorsque vous ajoutez une nouvelle image. seule l'instance Image est en cours de sauvegarde.

Déplacez votre appel de fonction dans le modèle Image et tout ira bien.

def on_image_saved(instance):
    for img in Image.objects.filter(modell=instance.modell)
        print img

class Image(models.Model):
    modell = models.ForeignKey(Modell, related_name="images")
    image = ThumbnailImageField('bilde', upload_to=get_upload_path_image)

    class Meta:
        verbose_name = 'bilde'
        verbose_name_plural = 'bilder'

    def __unicode__(self):
        return str(self.image)

    def save(self, **kwargs):
        super(Image, self).save(**kwargs)

        on_image_saved(self)

Je l’ai résolu d’une manière ou d’une autre, mais c’est une ferme optimale, j’ai fait la fonction modell_on_save lors de la sauvegarde d’images, cela fonctionne, mais le problème est que s’il y a 5 images liées et enregistrées dans le modèle, il y aura 5 appels à la fonction, et c'est mauvais. J'aimerais que cela ne se produise qu'après le dernier ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top