68 votes

Remplir le champ Django avec pre_save() ?

class TodoList(models.Model):
    title = models.CharField(maxlength=100)
    slug = models.SlugField(maxlength=100)
    def save(self):
        self.slug = title
        super(TodoList, self).save()

Je suppose que ce qui précède est de savoir comment créer et stocker un slug lorsqu'un titre est inséré dans la table TodoList, sinon, corrigez-moi s'il vous plaît !

Quoi qu'il en soit, j'ai examiné pre_save() comme un autre moyen de le faire, mais je n'arrive pas à comprendre comment cela fonctionne. Comment faites-vous avec pre_save() ?

est-ce comme

 def pre_save(self):
     self.slug = title

Je suppose que non. Quel est le code pour faire ça ?

Merci!

112voto

Bernhard Vallant Points 18035

Vous faites très probablement référence au signal pre_save de Django. Vous pouvez configurer quelque chose comme ceci :

 from django.db.models.signals import pre_save
from django.dispatch import receiver
from django.template.defaultfilters import slugify

@receiver(pre_save)
def my_callback(sender, instance, *args, **kwargs):
    instance.slug = slugify(instance.title)

Si vous n'incluez pas l'argument sender dans le décorateur, comme @receiver(pre_save, sender=MyModel) , le rappel sera appelé pour tous les modèles.

Vous pouvez mettre le code dans n'importe quel fichier qui est analysé pendant l'exécution de votre application, models.py est un bon endroit pour cela.

30voto

Leandro Souza Points 271
@receiver(pre_save, sender=TodoList)
def my_callback(sender, instance, *args, **kwargs):
    instance.slug = slugify(instance.title)

19voto

Eyal Ch Points 186

vous pouvez utiliser django signaux.pre_save :

 from django.db.models.signals import post_save, post_delete, pre_save

class TodoList(models.Model):
    @staticmethod
    def pre_save(sender, instance, **kwargs):
        #do anything you want

pre_save.connect(TodoList.pre_save, TodoList, dispatch_uid="sightera.yourpackage.models.TodoList") 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X