2011-06-23 18 views
31
class TodoList(models.Model): 
    title = models.CharField(maxlength=100) 
    slug = models.SlugField(maxlength=100) 
    def save(self): 
     self.slug = title 
     super(TodoList, self).save() 

Supongo que lo anterior es cómo crear y almacenar una babosa cuando se inserta un título en la tabla TodoList, si no, ¡por favor corrígeme!Poblando el campo django con pre_save()?

De todos modos, he estado buscando en pre_save() como otra forma de hacer esto, pero no puedo entender cómo funciona. ¿Cómo lo haces con pre_save()?

Cómo es

def pre_save(self): 
    self.slug = title 

supongo que no. ¿Cuál es el código para hacer esto?

Gracias!

Respuesta

52

Lo más probable es que te refieras a django's pre_save signal. Usted puede configurar algo como esto:

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 no incluir el argumento remitente en el decorador, como @receiver(pre_save, sender=MyModel), la devolución de llamada se llamará para todos los modelos.

Puede poner el código en cualquier archivo que se analice durante la ejecución de su aplicación, models.py es un buen lugar para eso.

+0

GRACIAS !!!!!! Por cierto, ¿qué es mejor? ¿Usar save o pre_save? – Derek

+4

@Derek: simplemente anule 'save()'. Es mucho, mucho más simple y más predecible. –

+7

¿Mejor? Básicamente, es lo mismo ... Si quieres cambiar la funcionalidad de una aplicación existente, con la señal es la forma preferida ... –

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

puede utilizar Django signals.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") 
Cuestiones relacionadas