Pour mon application, je dois effectuer des opérations supplémentaires lorsqu'un modèle est enregistré via un formulaire. En pratique, je dois ajouter une valeur dans un autre modèle si certaines conditions sont présentes dans le formulaire.
Pour ce faire, j'ai deux options, mais je veux comprendre les avantages et les inconvénients des deux.
J'utilise actuellement ce dernier de cette manière
def save_model(self, request, obj, form, change): #some pre save operations.... #this call the save model method super(MyModelAdmin, self).save_model(request, obj, form, change) #some post save operations...
et cela fonctionne
Mais ce que je veux comprendre, c'est: p>
3 Réponses :
Si possible, je préférerais ajouter des signaux en écrasant le save_model. Les signaux permettent à certains expéditeurs de notifier un ensemble de destinataires qu'une action a eu lieu. Ils sont particulièrement utiles lorsque de nombreux morceaux de code peuvent être intéressés par les mêmes événements. Cela ressemble également au paradigme de la programmation événementielle . Cela aide à organiser et nettoyer le code.
Je pense que vous avez raison. Et cela pourrait vous aider à comprendre la différence.
Méthode save_model
de ModelAdmin
appelée lorsque vous essayez de créer ou de mettre à jour quelque chose depuis django admin uniquement mais les signaux sont déclenchés quoi qu'il en soit du lieu où les actions se sont produites. Ce qui signifie que les opérations pre
ou post
dans la méthode save_model
ne fonctionneront pas si vous changez de modèle en dehors de django admin strong > mais les signaux fonctionneront à la fois en dehors des vues d'administration et à partir de vos blocs de code écrits personnalisés.
Prenons un exemple assez régulier du processus. Nous voulons enregistrer un nouvel utilisateur et nous avons également créé un modèle de profil que nous voulons que le profil d'un utilisateur soit enregistré uniquement lorsque des informations utilisateur valides sont enregistrées.
Nous pouvons créer un nouvel utilisateur dans l'admin de Django et utiliser la méthode saved_model
dans ModelAdmin
pour enregistrer d'autres parties du formulaire dans le Profile code> modèle. C'est la manière «normale» de procéder. Mais en utilisant cette méthode, vous ne pouvez accéder à l'utilisateur et au profil qu'à partir du panneau d'administration de Django. Un formulaire «d'enregistrement d'utilisateur» en dehors de l'administrateur Django ne fonctionnerait pas car l'utilisateur devrait être enregistré pour accéder aux contrôles d'administration de Django.
Mais en utilisant le signal post_save
, un nouvel utilisateur et un nouveau profil peuvent être créés et mis à jour que vous utilisiez le panneau d'administration Django ou un formulaire personnalisé qui s'enregistre dans User
et Modèles de Profil
.
L'utilisation des signaux est donc la plus flexible mais vous devrez maintenant vous assurer d'avoir un moyen de valider les informations provenant du formulaire personnalisé.
De la façon dont je le vois, un objet modèle peut être enregistré à partir de n'importe où dans votre application, pas seulement de l'administrateur django. La seule façon de s'assurer que quelque chose se passe à chaque fois qu'un objet est enregistré est d'utiliser des signaux pré / post_save ou de remplacer la méthode .save (). Après cela, tout ce que vous avez à faire est de faire attention aux mises à jour en masse.