9
votes

Pourquoi Django post_save signal me donne-t-il des données pré_save?

im essayant de connecter une "information" objet à de nombreux "clients" (voir code ci-dessous)

Lorsqu'un objet d'information est mis à jour, je souhaite envoyer un courrier électronique à chaque client qui est connecté aux informations. P >

Cependant, lorsque je connecte le champ Sold_to que le signal reçoit toujours ce que les données sont comme avant la sauvegarde. P>

Je suppose que c'est parce que son multilingfield et les données sont stockées dans Une table séparée, mais ne devrait pas être appelée le signal Post_save après avoir été mis à jour? P>

Quelqu'un a une suggestion d'une solution? P>

class Customer
    name = models.CharField(max_length=200)
    category = models.ManyToManyField('Category',symmetrical=False)
    contact = models.EmailField()

class Information
    name = models.CharField(max_length=200)
    email = models.EmailField(max_length=200)
    mod_date = models.DateTimeField(auto_now=True)
    sold_to = models.ManyToManyField(Customer, null=True, blank=True)


def send_admin_email(sender, instance, signal, *args, **kwargs):
    from myapp import settings
    for cust in instance.sold_to.all():
        settings.debug(cust.name)

post_save.connect(send_admin_email, sender=Information)


0 commentaires

3 Réponses :


5
votes

Il y a un ticket ouvert pour le problème à laquelle vous êtes confronté à ici . Vous pouvez soit garder un œil sur cela pour quand il en fait une libération, ou vous pouvez essayer d'appliquer le patch qu'il fournit et voyez si cela aide.


1 commentaires

Merci pour la réponse rapide. J'ai essayé le patch et après un petit piratage, je l'ai eu pour travailler. Postera la solution ci-dessous.



2
votes

Ceci est ma solution, après avoir appliqué le patch à partir de code.djangoproject.com mentionné ci-dessus.

a ajouté ceci dans modèles.pycops.pycumxx x/pre >p> et la fonction Send_Admin_Email : xxx


0 commentaires

2
votes

Je rencontre dans le même problème depuis que j'ai des champs M2M dans mon modèle, j'ai aussi reçu les données pré_save.

Dans la situation, le problème est que dans les champs M2M, les deux modèles associés doivent être enregistrés afin d'obtenir les identifiants automatiques générés. P>

Dans ma solution, ni j'ai utilisé le signal post_save, ni le signal M2M_Changed, au lieu de ces signaux, j'ai utilisé log_addition et log_change méthodes dans la définition de classe MODERADMIN. p>

dans votre classe ModelAdmin CustomAdmin: P>

    class CustomModelAdmin(admin.ModelAdmin):
         def log_addition(self, request, object):
         """
         Log that an object has been successfully added.
         """
             super(CustomModelAdmin, self).log_addition(request, object)
             #call post_save callback here object created

         def log_change(self, request, object):
         """
         Log that an object has been successfully changed.
         """
             super(CustomModelAdmin, self).log_change(request, object)
             #call post_save callback here object changed


1 commentaires

J'aime la solution. Dans Django 3, log_addition, log_change Prenez 3 arguments de position comme log_addition (demande, objet, message) ou log_change (demande, objet, message). omission que le troisième argument augmentera une erreur