使用pre_save()填充Django字段?

68 投票
5 回答
87522 浏览
提问于 2025-04-16 20:11
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 表时创建和存储一个“slug”的,如果我错了,请纠正我!

无论如何,我一直在研究 pre_save() 这个方法,想用它来实现这个功能,但我搞不清楚它是怎么工作的。请问用 pre_save() 怎么做呢?

是不是像下面的代码片段那样?

def pre_save(self):
        self.slug = title

我猜不是。那要怎么写代码呢?

谢谢!

5 个回答

19

你可以使用 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") 
31
@receiver(pre_save, sender=TodoList)
def my_callback(sender, instance, *args, **kwargs):
    instance.slug = slugify(instance.title)

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

116

你可能是在说 django的 pre_save 信号。你可以设置类似这样的东西:

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 是个不错的选择。

撰写回答