【问题标题】:Process field before database insert / update数据库插入/更新前处理字段
【发布时间】:2010-08-14 22:28:11
【问题描述】:

我有一个带有文本字段的 Django 模型。我在管理站点上使用富文本编辑器 (nicEdit) 以允许客户端轻松地在字段中输入标记。我想处理字段的内容并在将任何内容插入数据库之前执行一些操作。

例如,我想去除 MS Word、字体标签等生成的垃圾。我希望这部分应该很简单,但我不确定要覆盖或挂钩以使其正常工作。

我还想检测远程链接的图像,将本地副本下载到 MEDIA_ROOT,并将 img src 重新链接到本地​​图像。我不太确定如何获取远程图像;我认为django.Storage 可能会有所帮助,但它似乎无法从远程 URL 获取内容。

有什么建议吗?

【问题讨论】:

    标签: python django django-admin


    【解决方案1】:

    若要在保存模型之前操作模型中的数据,请使用 save() 方法,例如:

    def save(self):
      self.NameOfTextField = myCustomCleanFunction(self.NameOfTextField)
      super(YourModelName, self).save()
    

    在执行super(modelname, self).save() 之前不会保存任何内容。

    如果您希望引发某种类型的错误而不是静默处理它,您可能希望将clean() 方法与raise ValidationError() 结合使用。

    下载远程内容对我来说是新的,所以我无法帮助你。您可能需要查看 Django 并找到 Python 函数来完成这项工作。

    【讨论】:

    • 这听起来像我要找的。我稍后会尝试并报告。
    • 它可以工作,但它不可重用,除非我可以在抽象基类中替换 YourModelName 以获得正确的类。
    • @no:您可以通过使用signal 在单独的方法中添加该代码来轻松使其可重用,而不是覆盖save 代码。
    • 那么如果我不覆盖保存,他们如何从管理界面保存它?
    • @no:您可以使用 pre_save 信号而不是覆盖 savedocs.djangoproject.com/en/dev/ref/signals/…
    【解决方案2】:

    剥离垃圾等应该使用自定义表单域来完成。

    正在下载图片...有多种方法可以解决该问题。

    • 如果您选择将图像位置和原始位置存储在数据库中,则应使用预保存信号。
    • 如果您选择直接在本地存储图像,那么您也可以将其作为表单域的一部分。只需下载所有远程图像并用本地 url 替换 url。

    【讨论】:

    • 我应该提到我还没有弄乱表单,更不用说创建自定义表单字段了。如果您可以发布一个简短的示例,我将不胜感激。另外,如何下载图片?
    • @no:在那种情况下,你为什么不尝试这样的事情:code.google.com/p/django-richtext
    • 谢谢,我去看看源码。从那里链接的 django-photologue 项目看起来也不错。这仍然不能解决图片下载问题,但看起来 urllib 可以解决这个问题。
    • re: django-richtext: 你到底是怎么安装这个东西的?
    • 安装应该像在模型中使用 content = AdminRichTextField() 和/或在表单中使用 message = RichTextField() 一样简单。
    【解决方案3】:

    这对我有用...

    
    class MyModel(models.Model):
       text = model.TextField()
    
       def save(self, *args, **kwargs):
            self.text= myCustomCleanFunction(self.text)
            super().save(*args, **kwargs)  
    

    如果过程简单你可以把代码放在save函数中,而不是函数调用myCustomCleanFunction(self.text)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-16
      • 1970-01-01
      • 2011-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多