2010-01-29 6 views
3

J'ai donc deux modèles (Tables) liés par un ForeignKey. Dans l'admin, la page d'édition affiche le premier modèle (disons ModelOne) avec les instances connexes du second modèle, ModelTwo (TabularInline).Les formes de modèle en ligne émettent-elles des signaux post-enregistrement? (django)

Ce que je veux est d'effectuer des actions supplémentaires lorsque le deuxième modèle est en cours de modification. Je peux le faire avec un signal post_save sur ModelTwo. Cependant, le signal post_save n'est appelé que lorsque je sauvegarde le modèle depuis sa propre page d'édition (c'est-à-dire pas dans les inlines de ModelOne).

Y at-il un moyen d'attacher un signal post_save sur le formulaire en ligne de ModelTwo?

... Comme une solution de contournement j'ai ajouté une validation personnalisée à ModelTwo, qui est appelée indépendamment de si elle est en ligne ou non, pour appeler la méthode que je veux. Cependant, le problème qui découle de ce paramètre est que si je crée une nouvelle instance de ModelOne et crée également des instances de ModelTwo en même temps je ne peux pas accéder à la clé primaire (clé étrangère) de la nouvelle instance qui relie les deux tables (depuis il n'a pas encore été enregistré). Et la clé primaire est quelque chose dont j'ai besoin.

J'ai aussi essayé d'ajouter un signal post_save à ModelOne directement (pour que je puisse obtenir le PK de la nouvelle instance), mais il semble que le signal de post_save ne passe pas les données de ModelTwo (et pourquoi devrait-il, de toute façon?)

Alors, quelle est la solution à cela? Les modèles en ligne émettent-ils des signaux? Est-il possible d'accéder au PK de la nouvelle instance avant de l'enregistrer?

Répondre

4

Les modèles sont des modèles. Le fait qu'un Modèle soit utilisé dans l'interface d'admin comme inline ne le supprime en aucune façon. Tous les modèles émettent un signal de post-sauvegarde à moins que vous ne remplaciez sa fonctionnalité.

Here is what happens when you save any model.

+1

Oui, il semble que les signaux de post-sauvegarde ne sont envoyés que lorsque les formulaires sont réellement sauvegardés, c'est-à-dire que de nouvelles données arrivent ou que les données existantes ont changé. –

4

La plupart du temps quand une solution est apparue à résoudre avec un signal, il a fini par être mieux résoudre en remplaçant l'une des différentes méthodes sauver. J'ai eu beaucoup de succès à l'injection du code supplémentaire à gagner du temps en remplaçant l'une des deux méthodes:

  1. Les Admin Object's save_model method
  2. Les Model's save method.

Les signaux sont toujours à portée de main, mais je viens avait plus de chance à ces deux endroits.

+0

Je reçois mal sur les deux lien sur votre premier lien – Charlesliam

+0

est maintenant actuellement dans [Méthode save_model de l'objet Admin Object 1.6] (https://docs.djangoproject.com/fr/1.6/ref/contrib/admin/#django.contrib .admin.ModelAdmin.save_model) et [méthode de sauvegarde du Modèle 1.6] (https://docs.djangoproject.com/fr/1.6/topics/db/models/#overriding-predefined-model-methods). – Charlesliam

1

tout ce qui précède est correct, juste ajouter plus de chose: lorsque vous enregistrez un objet dans admin (qui contient en ligne), le signal «post-sauvegarde» de l'inline (et bien sûr la méthode de sauvegarde de l'inline objet) sont déclenchés uniquement si vous avez apporté des modifications à l'objet en ligne.

Questions connexes