web-dev-qa-db-fra.com

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 comment créer et stocker un slug lorsqu'un titre est inséré dans la table TodoList, sinon corrigez-moi!

Quoi qu'il en soit, j'ai cherché dans pre_save () un autre moyen de le faire, mais je ne peux pas comprendre comment cela fonctionne. Comment faites-vous avec pre_save ()?

est-ce que c'est comme

def pre_save(self):
     self.slug = title

Je devine non. Quel est le code pour le faire?

Merci!

38
Derek

Vous vous référez probablement à le 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 de l'expéditeur dans le décorateur, comme @receiver(pre_save, sender=MyModel), le rappel sera appelé pour tous les modèles.

Vous pouvez placer le code dans n'importe quel fichier analysé lors de l'exécution de votre application. models.py est un bon emplacement pour cela.

64
Bernhard Vallant
@receiver(pre_save, sender=TodoList)
def my_callback(sender, instance, *args, **kwargs):
    instance.slug = slugify(instance.title)
20
Leandro Souza

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") 
11
Eyal Ch

Les fonctions du récepteur doivent être comme ceci:

def my_callback(sender, **kwargs):
    print("Request finished!")

Notez que la fonction utilise un argument sender, ainsi que les arguments de mot clé générique (** kwargs); tous les gestionnaires de signaux doivent prendre ces arguments.

Tous les signaux envoient des arguments mot clé et peuvent modifier ces arguments à tout moment.

Référence ici .

0
Rockallite