2011-06-23 168 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")