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

Tôi giả định ở trên là cách tạo và lưu trữ một con sên khi tiêu đề được chèn vào bảng TodoList, nếu không, hãy sửa tôi!Điền vào trường django với pre_save()?

Nhưng dù sao, tôi đã xem xét pre_save() như một cách khác để thực hiện việc này, nhưng không thể tìm ra cách hoạt động của nó. Làm thế nào để bạn làm điều đó với pre_save()?

là nó thích

def pre_save(self): 
    self.slug = title 

Tôi đoán không. Mã để làm điều này là gì?

Cảm ơn!

Trả lời

52

Rất có thể bạn đang đề cập đến django's pre_save signal. Bạn có thể thiết lập một cái gì đó như thế này:

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) 

Nếu bạn không bao gồm các tham số người gửi trong trang trí, như @receiver(pre_save, sender=MyModel), callback sẽ được gọi cho tất cả các mô hình.

Bạn có thể đặt mã vào bất kỳ tệp nào được phân tích cú pháp trong khi thực hiện ứng dụng của bạn, models.py là một nơi tốt cho điều đó.

+0

THANK YOU !!!!!! btw, đó là tốt hơn - bằng cách sử dụng lưu hoặc pre_save? – Derek

+4

@Derek: Chỉ cần ghi đè 'save()'. Nó đơn giản hơn nhiều và dễ dự đoán hơn. –

+7

Tốt hơn? Nó về cơ bản giống nhau ... Nếu bạn muốn thay đổi chức năng của một ứng dụng hiện tại đi với tín hiệu là chắc chắn cách ưa thích ... –

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

bạn có thể sử dụng 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") 
Các vấn đề liên quan