使用pre_save()填充Django字段?
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
是个不错的选择。