在数据库插入/更新前处理字段

3 投票
3 回答
2197 浏览
提问于 2025-04-16 02:48

我有一个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

去掉一些多余的内容应该用自定义的表单字段来处理。

下载图片的话,有好几种方法可以解决这个问题。

  • 如果你选择把图片的位置和原始位置存到数据库里,那么你应该在保存之前用一个信号来处理。
  • 如果你选择直接把图片存到本地,那你也可以把这个过程放在表单字段里。简单来说,就是下载所有远程的图片,然后把网址换成本地的网址。

撰写回答