2011-06-23 126 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() 

我假设上面是如何创建和存储一个标题插入表TodoList,如果没有,请纠正我一个slu!!用pre_save()填充django字段?

无论如何,我一直在寻找pre_save()作为另一种方式来做到这一点,但无法弄清楚它是如何工作的。你怎么用pre_save()做到这一点?

是什么样子

def pre_save(self): 
    self.slug = title 

我猜没有。这是什么代码?

谢谢!

回答

52

很有可能您指的是django's pre_save signal。你可以设置这样的事情:

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) 

如果你不包括装饰发件人的说法,像@receiver(pre_save, sender=MyModel),回调将被用于所有车型。

您可以将代码放入执行应用程序过程中解析的任何文件中,models.py是一个很好的选择。

+0

谢谢!!!!!!顺便说一句,这是更好的 - 使用保存或pre_save? – Derek

+4

@Derek:只需重写'save()'。它更简单,更可预测。 –

+7

更好?它基本上是一样的......如果你想改变一个现有的应用程序的功能与信号是肯定的首选方式... –

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

你可以使用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")