用pre_save()填充Django字段?

2024-06-16 10:06:57 发布

您现在位置:Python中文网/ 问答频道 /正文

class TodoList(models.Model):
    title = models.CharField(maxlength=100)
    slug = models.SlugField(maxlength=100)
    def save(self):
        self.slug = title
        super(TodoList, self).save()

我假设上面是如何创建和存储一个slug当一个标题被插入到表toolist,如果不是,请纠正我!

不管怎样,我一直在研究pre_save()作为另一种方法来实现这一点,但不知道它是如何工作的。如何使用pre_save()来执行此操作?

是不是像

def pre_save(self):
     self.slug = title

我猜不会。做这个的代码是什么?

谢谢!


Tags: self标题modeltitlemodelssavedefpre
3条回答
@receiver(pre_save, sender=TodoList)
def my_callback(sender, instance, *args, **kwargs):
    instance.slug = slugify(instance.title)

您可以使用django信号。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") 

很可能你指的是django's ^{} 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)

如果在decorator中不包括sender参数,比如@receiver(pre_save, sender=MyModel),那么将为所有模型调用回调。

您可以将代码放在应用程序执行期间解析的任何文件中,models.py是一个很好的地方。

相关问题 更多 >