在数据库插入/更新前处理字段
我有一个Django模型,里面有一个文本字段。我在管理后台使用了一个富文本编辑器(nicEdit),这样客户就可以方便地在这个字段里输入格式化的内容。我想在把内容插入数据库之前,先处理一下这个字段的内容,做一些操作。
比如说,我想去掉一些MS Word生成的垃圾内容、字体标签等等。我觉得这部分应该比较简单,但我不太确定应该重写哪个部分或者怎么去实现。
我还想检测一下那些链接到外部的图片,下载一份到本地的MEDIA_ROOT文件夹,并把图片的链接改成指向本地的图片。我不太确定怎么去获取这些远程图片;我原以为django.Storage
可以帮忙,但看起来它无法从远程网址获取内容。
有什么建议吗?
3 个回答
0
这个对我有用...
class MyModel(models.Model):
text = model.TextField()
def save(self, *args, **kwargs):
self.text= myCustomCleanFunction(self.text)
super().save(*args, **kwargs)
如果这个过程很简单,你可以把代码直接放在保存功能里面,而不是调用 myCustomCleanFunction(self.text)
这个函数。
9
在保存模型数据之前,如果你想对数据进行一些处理,可以使用 save()
方法,像这样:
def save(self):
self.NameOfTextField = myCustomCleanFunction(self.NameOfTextField)
super(YourModelName, self).save()
在执行 super(modelname, self).save()
之前,数据是不会被保存的。
如果你想在出现错误时能够抛出一些类型的错误,而不是默默处理掉这些错误,你可能需要使用 clean()
方法,并结合 raise ValidationError()
来实现。
下载远程内容对我来说是个新鲜事,所以我帮不了你。你可能需要超出 Django 的范围,去找一些 Python 的函数来完成这个任务。
3
去掉一些多余的内容应该用自定义的表单字段来处理。
下载图片的话,有好几种方法可以解决这个问题。
- 如果你选择把图片的位置和原始位置存到数据库里,那么你应该在保存之前用一个信号来处理。
- 如果你选择直接把图片存到本地,那你也可以把这个过程放在表单字段里。简单来说,就是下载所有远程的图片,然后把网址换成本地的网址。